后期静态绑定

时间:2012-09-27 14:22:29

标签: php static this

在以下情况下,我们是否需要使用static::$attribute代替$this->attribute

b.php

class B {
public function tellAttribute(){
// $this OR static ??
    echo $this->attribute;
}
}

a.php只会

include 'b.php';

class A extends B {
public $attribute = 'foo';
}

$test = new A();
$test->tellAttribute();

问这个是因为我不应该工作,除非我使用static::$attribute但它仍然回应 foo 。是什么原因?

4 个答案:

答案 0 :(得分:2)

B类定义了一个名为tellAttribute()的公共函数,如下所示:

public function tellAttribute(){
    echo $this->attribute;
}

然后,您实例化A类 - B类的孩子 - 并执行此操作:

$test = new A();
$test->tellAttribute();

因此,您实例化类A的对象,然后在此对象上调用tellAttribute()。因为tellAttribute()方法使用$this变量,所以您指的是实例化的实际对象。即使您在类tellAttribute()中定义了B - 父级 - 它实际上将指向您拥有公共{{1}的子对象(类A的实例)属性。这就是为什么它打印$attribute以及为什么你不需要使用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(); 变量,而是使用$thisself::static::tellAttribute(),并且始终会打印self::。这是因为foo只能引用当前的类。 self::使用tellStaticAttribute()并将“动态”打印该类。我在技术术语等方面不是太棒了所以我会给你留下手册的链接(我收集你已经从你的帖子中读过):http://php.net/manual/en/language.oop5.late-static-bindings.php

希望能回答你的问题。

答案 1 :(得分:1)

  

我们是否需要使用static :: $属性而不是$ this-&gt;属性   在以下条件下:&lt;代码&gt;

,您最明确地不在您描述的方案中使用static关键字,并且没有理由 无法正常工作。将$this的上下文视为将所有不同的继承类“加”为一个的结果。也就是说,如果class B extends Aclass C extends B,通过实例化C,类A,B和C的所有属性和函数都可以通过类中的$this上下文获得,并且C完全可以在它自己的B函数中定义的属性中使用,反之亦然,因为一切就好像它是你实例中的一个独立类。

答案 2 :(得分:0)

是的,它会起作用.... $attribute是公共的......而A还继承了tellAttribute()我不确定你的期望。

答案 3 :(得分:0)

您没有在任何地方使用“static”关键字。这里的一般类设置对我来说有点奇怪,但是如果你想将$属性变成一个静态变量,你需要输入:

 public static $attribute = 'foo';

请记住,静态变量基本上是一个全局变量,您可以在此处查看更多内容:http://php.net/manual/en/language.oop5.static.php