parent ::在实例化的类中

时间:2010-01-10 19:44:38

标签: php

我想知道为什么php中没有$parent->function();语法,但我们可以使用parent::function();,它看起来像是在静态类中使用的。我错过了一些php oop基础知识吗?

3 个答案:

答案 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();