2014-07-22 122 views
0

爲什麼子類不在父類構造方法裏面?我應該做出什麼改變來獲得A,B,C的執行類的構造方法,以便當我運行$obj = new C();PHP OOP繼承順序

<?php 

class A 
{ 

    function A() 
    { 
     echo "I am the constructor of A. (Grand Parent)<br />\n"; 
    } 
} 

class B extends A 
{ 

    function B() 
    { 
     echo "I am the constructor of B. (Parent)<br />\n"; 
    } 
} 

class C extends B 
{ 

    function C() 
    { 
     echo "I am the constructor of C. (Child)<br />\n"; 
    } 
} 

$obj = new C(); 
?> 

回答

1

首先:您使用的是你的類被廢棄的語法。您應該使用構造函數的__construct()函數。其次,如果在子中定義了一個,PHP不會隱式地調用父構造函數。這意味着你需要自己調用它。

結合這兩個思路,我們得到:

<?php 

class A 
{ 
    function __construct() 
    { 
     echo "I am the constructor of A. (Grand Parent)<br />\n"; 
    } 
} 

class B extends A 
{ 
    function __construct() 
    { 
     echo "I am the constructor of B. (Parent)<br />\n"; 
     parent::__construct(); 
    } 
} 

class C extends B 
{ 
    function __construct() 
    { 
     echo "I am the constructor of C. (Child)<br />\n"; 
     parent::__construct(); 
    } 
} 

$obj = new C(); 
?> 

的PHP引用here。請注意,舊的語法與PHP 5.3.3以後的命名空間類存在兼容性問題。您應該更改新代碼的語法。

1

您需要顯式調用父類的構造這樣parent::__construct();。所以現在你可以調用類C中的類B構造函數和類B中的類A構造函數。 希望得到這個幫助:)

1

你需要明確地調用父類的構造函數。

<?php 

class A 
{ 

    function A() 
    { 
     echo "I am the constructor of A. (Grand Parent)<br />\n"; 
    } 
} 

class B extends A 
{ 

    function B() 
    { 
     A::__construct(); // Like this 
     echo "I am the constructor of B. (Parent)<br />\n"; 
    } 
} 

class C extends B 
{ 

    function C() 
    { 
     B::__construct(); // Like this 
     echo "I am the constructor of C. (Child)<br />\n"; 
    } 
} 

$obj = new C(); 
?> 

,你可以找到一些解決方法here