1

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

b.php

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

一个.php

include 'b.php';

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

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

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

4

4 回答 4

2

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

希望这能回答你的问题。

于 2012-09-27T14:46:20.730 回答
1

我们是否需要在以下情况下使用 static::$attribute 而不是 $this->attribute :<code>

,您绝对不会static在您描述的场景中使用关键字,并且没有理由工作。将上下文$this视为将所有不同的继承类“加起来”为一个的结果。也就是说,如果class B extends Aclass C extends B,通过实例化 C,类 A、B 和 C 的所有属性和函数都可以通过$this类内的上下文获得,并且 C 在自己的函数中使用属性是完全可以的在 B 中定义,反之亦然,因为一切都在那里,就好像它是您实例中的一个独立类。

于 2012-09-27T14:48:46.373 回答
0

是的,它会起作用....$attribute是公开的......而且A也继承了tellAttribute()我不确定你在哪里期待什么。

于 2012-09-27T14:25:10.693 回答
0

您没有在任何地方使用“静态”关键字。您在这里的一般类设置对我来说有点奇怪,但是如果您希望 $attribute 成为静态变量,则需要键入:

 public static $attribute = 'foo';

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

于 2012-09-27T14:26:00.997 回答