我想知道为什么php中没有$parent->function();
语法,但我们可以使用parent::function();
,它看起来像是在静态类中使用的。我错过了一些php oop基础知识吗?
答案 0 :(得分:2)
好吧,parent
实际上引用了静态父类 - 没有理由假设存在实例化$parent
只是因为存在$child
,即使有,$child
{1}}无法访问$parent
。
最后,通常class dog extends animal
OOP解释不起作用的实例! :)
答案 1 :(得分:2)
我承认这似乎很奇怪 - 你在手册中没有遗漏任何内容^^
但是:
__construct
之外,我承认 - 这可能就是为什么在手册中明确说明你必须亲自调用父亲的__construct
方法。$this
来调用子类或父类的相同实例中的方法;无需知道方法的实际位置。parent::
工作正常,即使它看起来像静态调用
以下是显示parent::
的代码示例:
class Father {
public function method() {
var_dump($this->a);
}
}
class Son extends Father {
protected $a;
public function method() {
$this->a = 10;
parent::method();
}
}
$obj = new Son();
$obj->method();
你会得到这个输出:
$ /usr/local/php-5.3/bin/php temp.php
int(10)
这表明父类中的方法可以访问$this
以及子类中定义的属性。
答案 2 :(得分:1)
因为使用$parent
假定您实际已实例化了父类。
如果您的语法建议有效,那就意味着每次实例化一个对象时,都会实例化2个或更多对象。
在PHP中,每个变量必须包含字符串,整数(或其他数字格式),数组,对象或资源。 $this
包含一个对象,它恰好是您当前所在的对象。
要创建$parent
,您必须在$parent
内放置一个对象。您的父类在技术上没有实例化,因此无法将其分配给变量。
BTW parent::function();
可以访问所有$this
。
因此,这是有效的
class Test
{
public function test()
{
echo $this->testing_var;
}
}
class OtherTest
{
public function run()
{
$this->testing_var = "hi";
Test::test(); // echos hi
}
}
如果在课外使用它会发生错误,并告诉你它应该被声明为静态。
Test::test();