B 类定义了一个名为的公共函数tellAttribute()
,如下所示:
public function tellAttribute(){
echo $this->attribute;
}
然后实例化 A 类 - B 类的子类 - 并执行以下操作:
$test = new A();
$test->tellAttribute();
所以,你实例化一个类的对象,A
然后调用tellAttribute()
这个对象。因为该tellAttribute()
方法使用$this
您所指的变量,您已实例化的实际对象。即使您tellAttribute()
在类B
中定义 - 父级 - 它实际上将指向A
您拥有公共$attribute
属性的子对象( class 的实例)。这就是它打印的原因foo
以及您不需要使用static::
.
另一方面,考虑一下:
class B {
public static $attribute = 'foo';
public function tellAttribute(){
echo self::$attribute; // prints 'foo'
}
public function tellStaticAttribute() {
echo static::$attribute; // prints 'bar'
}
}
class A extends B {
public static $attribute = 'bar';
}
$test = new A();
$test->tellAttribute();
print "<BR>";
$test->tellStaticAttribute();
在此示例中,我没有使用$this
变量 and 而是使用self::
and static::
。tellAttribute()
具有并且将self::
始终打印foo
. 这是因为self::
只能引用当前类。使用tellStaticAttribute()
并将static::
“动态”打印类。我对技术术语等不太了解,所以我会给你一个手册的链接(我想你已经从你的帖子中读过): http: //php.net/manual/en/language .oop5.late-static-bindings.php
希望这能回答你的问题。