【发布时间】:2013-12-17 19:27:44
【问题描述】:
我在 PHP 中遇到了一些看起来很奇怪的事情。我正在尝试从非静态方法访问静态属性。我需要使用 static 关键字来访问此属性,因为它可以在每个子类中具有不同的值。
但是,它根本没有访问预期类的属性,而是访问调用类的属性。这对我来说似乎是一个错误,但如果不是,我想知道是否有人可以向我解释这种行为并解释我如何访问这个静态属性。
我在这里的期望是静态属性 $why 将从 B 类中获取。我很困惑为什么它会从 A 类中获取。
<?php
error_reporting(E_ALL & ~E_STRICT);
class A
{
public static $why = "Really don't want this value. Bug?";
public function callB()
{
$B = new B;
$B::getWhy(); // PHP Bug?
$B->getWhy();
$B::getWhyStatic();
$B::getWhyStaticSelf();
}
}
class Base {
protected static $why = "Don't want this value";
public static function getWhyStatic()
{
echo static::$why . "<BR>\n";
}
public static function getWhyStaticSelf()
{
echo self::$why . "<BR>\n";
}
public function getWhy()
{
echo static::$why . "<BR>\n";
}
}
class B extends Base
{
protected static $why = "Want this value?";
}
$A = new A;
$A->callB();
【问题讨论】:
-
您的问题需要更清楚,例如,您希望访问哪个属性,而您访问的是哪个属性?
-
添加了一些额外的说明。希望取消投票。
-
删除了反对票,请参阅下面我编辑的答案,将
$B::bah()更改为$B->bah()应该可以解决它 -
我不认为这是重复的。上面是问为什么可以静态调用非静态方法。我在问为什么,当它们被静态调用时,为什么会返回不正确的静态属性。