parent::method() - 调用非静态方法
parent::method() - calling non static method
我不明白 PHP 中调用父方法的概念。
父方法不是静态的,但它是静态调用的——通常 PHP 会抛出 error/warning.
问题是,这是 PHP 的怪癖,还是 OOP 中应该如此?
以php.net为例:
<?php
class A {
function example() {
echo "I am A::example() and provide basic functionality.<br />\n";
}
}
class B extends A {
function example() {
echo "I am B::example() and provide additional functionality.<br />\n";
parent::example();
}
}
$b = new B;
// This will call B::example(), which will in turn call A::example().
$b->example();
?>
http://php.net/manual/en/keyword.parent.php
In PHP 5, calling non-static methods statically generates an E_STRICT
level warning.
该通知意味着您不能将非静态定义的方法调用为静态方法,但是您在方法内部进行的调用不是静态调用,而是对父类的调用class。
所以这个调用会抛出 E_STRICT 警告:
$b = new B;
$b::example();
但你的例子不会
如果您查看 definition of static method,您会看到:
- 静态方法意味着与 class 的所有实例相关,而不是与任何特定实例相关。 - 事实上,此方法与所有 children 的 parent class.
- 即使 class 的实例不存在,也可以调用静态方法。 - 同样,您永远不会创建 parent 的实例class 调用方法。
所以我们可以把这个说法当作PHP的借口。顺便说一句,在 C++ 中也是以同样的方式完成的。
但是还有其他的语言,就是按照你说的那样做的。例如在JAVA中,parent方法调用如super.printMethod();
,在C#中是做得像 base.printMethod()
.
因此在 PHP 中可能会为了简化解析器而这样做,因为他们需要特定的边缘情况来进行此类调用 parent->printMethod()
.
我不明白 PHP 中调用父方法的概念。 父方法不是静态的,但它是静态调用的——通常 PHP 会抛出 error/warning.
问题是,这是 PHP 的怪癖,还是 OOP 中应该如此?
以php.net为例:
<?php
class A {
function example() {
echo "I am A::example() and provide basic functionality.<br />\n";
}
}
class B extends A {
function example() {
echo "I am B::example() and provide additional functionality.<br />\n";
parent::example();
}
}
$b = new B;
// This will call B::example(), which will in turn call A::example().
$b->example();
?>
http://php.net/manual/en/keyword.parent.php
In PHP 5, calling non-static methods statically generates an E_STRICT level warning.
该通知意味着您不能将非静态定义的方法调用为静态方法,但是您在方法内部进行的调用不是静态调用,而是对父类的调用class。
所以这个调用会抛出 E_STRICT 警告:
$b = new B;
$b::example();
但你的例子不会
如果您查看 definition of static method,您会看到:
- 静态方法意味着与 class 的所有实例相关,而不是与任何特定实例相关。 - 事实上,此方法与所有 children 的 parent class.
- 即使 class 的实例不存在,也可以调用静态方法。 - 同样,您永远不会创建 parent 的实例class 调用方法。
所以我们可以把这个说法当作PHP的借口。顺便说一句,在 C++ 中也是以同样的方式完成的。
但是还有其他的语言,就是按照你说的那样做的。例如在JAVA中,parent方法调用如super.printMethod();
,在C#中是做得像 base.printMethod()
.
因此在 PHP 中可能会为了简化解析器而这样做,因为他们需要特定的边缘情况来进行此类调用 parent->printMethod()
.