PHP后期静态绑定


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

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

1
2
3
4
5
6
7
8
9
10
11
12
13

</td>

<?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关键字来引用在运行时调用的类。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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::只能引用静态属性和静态方法。


原文链接:https://codingdict.com/