预先从5.0.0版开始编码的完全有效代码(无E_STRICT或E_DEPRECATED)
class A{
static public function b() {
}
public function c(){
$this->b();
}
}
$d = new A();
$d->c();
$d->b();
这看起来像是不一致的行为,因为您不能使用实例中的静态属性。
PHP的方法是随时窃取和借鉴其他语言 可能...
但是我找不到任何支持类似行为的编程语言。
PHP为什么支持它?将静态方法称为非静态方法有什么意义?
一些支持的解释:Expected behavior
答案 0 :(得分:2)
实际上,C ++和Java支持此功能。经过讨论,PHP开发人员似乎决定实现与他们匹配的方法。
经过一番挖掘,我发现2004年2月的this thread实质上是他们对实现选择的讨论。讨论中的重要花絮:
当bar()是静态方法时,C ++允许$ a-> bar()(是的,它被称为 在静态环境中也是如此)。
IMO,此处不应有错误,警告或通知。
我同意。 PHP很好。
无论最终实现如何,我认为都可以使用静态方法和 静态类变量应保持一致。目前,您无法访问 通过对象实例的类变量。
对于它的价值,我看不出为什么不能调用静态方法的原因 从物体。在这种情况下,请遵循Java / C ++。
最终,一个最终决定From Wez:
请删除该线程;我们没有改变静态的行为。
答案 1 :(得分:1)
在我看来,这只是语法方面的考虑。这里没有什么与静态方法的逻辑矛盾,在静态函数中仍然无法使用$this
,因此该函数将无法访问实例属性或方法。对我来说,这更像是捷径,而不是前后矛盾。
我没有用例,但是我想有人可能会发现它对于使用动态类名创建的对象很有用:即使您不知道它的类名,您仍然可以使用该函数。