2010-01-10 76 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();