PHP后期静态绑定

时间:2018-11-15 15:18:17  来源:igfitidea点击:

在本教程中,我们将学习PHP后期静态绑定(PHP Late Static Binding),这是在PHP 5.3中添加的一个有趣的功能。

让我们从一个简单的例子开始。

<?php

class Model {

    protected static $tableName = 'Model';

    public static function getTableName() {
        return self::$tableName;
    }

}

class User extends Model {

    protected static $tableName = 'User';

}

echo User::getTableName(); // Model, 而不是 User

首先,我们创建了一个模型类Model,它有:
一个值为Model的静态属性$tableName
和一个返回$tableName值的getTableName()静态方法。
注意,我们使用self和操作符::来访问模型类Model中的静态属性。

其次,我们创建了另一个名为User的类,它扩展了模型类Model。User类也有一个$tableName静态属性。

最后,我们调用User类的getTableName()方法。但是,它返回的是Model而不是User

原因是self总是解析为方法所属的类。这意味着,如果您在父类中定义了一个方法并从子类中调用它,self就不会像我们期望的那样引用子类。

为了解决这个问题,从5.3版本开始,PHP引入了一个称为PHP后期静态绑定的新特性。基本上,不使用self,而是使用static关键字来引用在运行时调用的类。

让我们修改一下上面的例子:

<?php
 
class Model{
    protected static $tableName = 'Model';
        public static function getTableName(){
        return static::$tableName;
    }
}
 
class User extends Model{
    protected static $tableName = 'User'; 
}
 
echo User::getTableName(); // User

现在我们就得到了想要的结果。

请注意,static::只能引用静态属性和静态方法。