在以下情况下,我们是否需要使用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 。是什么原因?
答案 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();
变量,而是使用$this
和self::
。 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 A
和class 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