如果到现在为止我理解了一点点现在我意识到我什么都不懂。我很困惑,我很难理解,我不能。有人可以在使用self,parent,static和how时解释这个程序 我所做的所有最小的改变都会改变结果而不会让我无法理解正在发生的事情。 非常感谢..
来自http://docs.php.net/language.oop5.late-static-bindings
的代码<?php
class A {
public static function foo() {
static::who();
}
public static function who() {
echo __CLASS__."\n";
}
}
class B extends A {
public static function test() {
A::foo();
parent::foo();
self::foo();
}
public static function who() {
echo __CLASS__."\n";
}
}
class C extends B {
public static function who() {
echo __CLASS__."\n";
}
}
C::test();
?>
输出是:
A
C
C
答案 0 :(得分:20)
您需要了解Late Static Binding的概念,该概念确定何时标识符绑定到代码/数据。您可以告诉PHP尽早绑定它(self::
)或更晚(static::
)。
将示例减少到我们得到的两个类:
class A {
public static function foo() {
self::who(); // PHP binds this to A::who() right away
static::who(); // PHP waits to resolve this (hence, late)!
}
public static function who() {
echo __CLASS__."\n";
}
}
class B extends A {
public static function test() {
self::foo();
}
public static function who() {
echo __CLASS__."\n";
}
}
B::test();
答案 1 :(得分:7)
看看http://php.net/manual/en/language.oop5.static.php。它说:
将类属性或方法声明为静态使它们可以访问,而无需实现类的实例化。
...
因为静态方法在没有创建对象实例的情况下是可调用的,所以伪变量$ this在声明为static的方法中不可用。
您不能使用$this
,因为在调用静态方法时,没有实例化的类对象放在$this
变量中。所以你使用self::
。
parent::
指的是当前类正在扩展的父类。例如,对于C类,父类是B类,而对于B类,父类是A类。请参阅http://php.net/manual/en/keyword.parent.php。
如果希望在不实际声明该类的实例的情况下访问该函数,则可以使用静态方法。
仔细检查您的问题后,您的链接指向Late Static Bindings。该页面中的前两个示例非常清楚地表明需要static::
语法,但要澄清您发布的示例:
查看A类中的foo()
方法。它调用static::who()
。这意味着方法who()
将在调用函数的类的范围内调用,而不是在定义函数的类的范围内调用。因此,如果你打电话给C::foo()
,它会回复C。
如果它调用self::who()
,则会调用A::who()
。因为在A类中,self::
指的是A。
希望这有帮助。
答案 2 :(得分:5)
答案的关键是 static :: who(),记住static ::意味着你用实际的类调用方法(在我们的例子中是C)。
所以C :: test()运行如下:
A::foo(); -> calls to A::foo() therefor echo A
parent::foo(); -> calls to C parent (which is B), B::foo() inherits A::foo() which calls to static::who(), but our actual class is C, therefor echo C
self::foo(); -> again calls to foo() which calls to static::who() with our actual class C
如果不是static :: who()foo正在调用self :: who(),那么你将得到三个A.