试图理解php中的后期静态绑定
建议您阅读“对象继承”试图理解php中的后期静态绑定,php,Php,建议您阅读“对象继承”self在编译时静态地“绑定”。这意味着在编译代码时,将决定self所指的内容静态在运行时解析,即在执行代码时解析。这是后期静态绑定。这就是区别 对于self,在编译时(当代码被“读取”时),self指的是记录。稍后将解析User的代码,但是Record中的self::$tableName已经引用了Record::$tableName,不能再进行更改 使用static时,引用不会立即解析。只有在调用User::getTableName()时才会解析它,此时您处于User的上
self
在编译时静态地“绑定”。这意味着在编译代码时,将决定self
所指的内容<代码>静态在运行时解析,即在执行代码时解析。这是后期静态绑定。这就是区别
对于self
,在编译时(当代码被“读取”时),self
指的是记录。稍后将解析User
的代码,但是Record
中的self::$tableName
已经引用了Record::$tableName
,不能再进行更改
使用static
时,引用不会立即解析。只有在调用User::getTableName()
时才会解析它,此时您处于User
的上下文中,因此静态::$tableName
解析为用户::$tableName
换句话说:self
总是指编写它的类,没有两种方式。静态
所指的内容取决于它在什么上下文中使用;实际上,这意味着,如果它所在的类正在扩展,那么它可能引用子类。这使得它的工作方式类似于$this
,仅适用于静态上下文。self
引用定义类范围
static
引用调用类作用域
self::$tableName
引用定义它的类。ie唱片
static::$tableName
引用调用它的类。ie用户下面的示例将给出延迟静态绑定的最低示例:
B::getName()
从A
输出$name
变量,因为self
是根据您在中定义的绝对当前类计算的。要解决这种情况,请使用static
这只是猜测,但static::
可能解析对象的实际类型,而不是编译时已知类型,并在该类型上查找名为$tableName
的静态变量。+1“类似$This,仅用于静态上下文”。这可能是我听过的最有说服力的行为描述了官方PHP文档团队应该雇用你!或者自己主动帮助他们;-)
<?php
class Record {
protected static $tableName = 'base';
public static function getTableName() {
echo self::$tableName;
}
}
class User extends Record {
protected static $tableName = 'users';
}
User::getTableName();
class A {
static public $name = "A";
static public function getName () {
return self::$name;
}
static public function getNameLateStaticBinding () {
return static::$name;
}
}
class B extends A {
static public $name = "B";
}
// Output: A
echo A::getName(), "\n";
// Output: A
echo B::getName(), "\n";
// Output: B
echo B::getNameLateStaticBinding() , "\n";