2010-01-10 36 views
3

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

回答

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) 

Wh ich显示父类中的方法有权访问$this以及在子类中定义的属性。

+1

我真的不觉得这很奇怪。因为变量不能包含类,所以它们必须包含实例化类的对象。因此,为了让'$ parent'存在,你必须实例化父对象以及子对象。 – 2010-01-10 20:03:46

2

嗯,其实parent引用静态父类 - 没有理由假设有一个实例$parent只是因为存在$child,即使有,$child就不必$parent访问。

最后,一个例子,其中通常的class dog extends animal OOP解释不起作用! :)

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 
    } 
} 

而如果是使用一类外,并会告诉你应该声明为static这会报错。

Test::test();