2013-01-13 138 views
0
class hydra { 
    var $dbcon; 

    function __construct($ezSQL){ 
     $this -> dbcon=$ezSQL; 
    } 

    } 
    class user extends hydra{ 
    function foo(){ 
     echo "bar is: ".$this->dbcon; 
    } 
    } 

然後我打電話:如何從父類訪問子函數

$hydra  = new hydra($ezSQL); 

然而,在這一點上,我得到以下錯誤:

Fatal error: Cannot instantiate abstract class hydra 

如何建立一個類將繼承它所有的兒童功能,所以我可以這樣做:

$hydra = new hydra("foobar"); 
$hydra -> foo(); 

輸出:

bar is: foobar

+0

你完全倒退了。孩子可以使用父母的功能,而不是其他方式。 – tvanfosson

+0

抽象類不能被實例化,這就是爲什麼他們被稱爲抽象。父母在孩子之後不會繼承,這是相反的方式。 – lafor

+0

那麼你有沒有辦法擁有一個「容器」類,你可以繼續添加擴展?看起來,反過來,創造X個孩子延伸彼此,然後只是有一個容器,所有的孩子都在延伸。 –

回答

1

您無法將兒童功能納入父母。試想一下,媽媽是否從女兒那裏得到了她的樣子?不是。它是從父母那裏繼承的孩子。

您提供的代碼不會引發任何錯誤。但從錯誤看來,九頭蛇是一個抽象類。因爲你想把孩子的方法稱爲九頭蛇,你應該把這個方法抽象化。現在

abstract class hydra { 
    var $dbcon; 
    function __construct($ezSQL){ 
     $this -> dbcon=$ezSQL; 
    } 
    abstract public function foo(); 
} 

可以實例user但撥打foo()方法hydra。它的幫助完全在類型暗示。

function dofoo(hydra $h){ 
    $h->foo(); 
} 
$user = new user("bar"); 
dofoo($user); 

這裏的功能dofoo看到$h作爲hydra實例。

+0

抽象類不必具有抽象方法。 – danronmoon

+0

@danronmoon你肯定(http://php.net/manual/en/language.oop5.abstract.php)嗎? –

+0

很確定... http://codepad.viper-7.com/1dK92v – danronmoon

0

我覺得你得到繼承錯誤的想法。 父項不從子項繼承函數,CHILD從父項繼承函數。 在你的情況下,hydra沒有功能foo()。 類user繼承構造函數和hydra的屬性,因此下面的代碼是什麼工作。

$hydraChild = new user("foobar"); 
$hydraChild -> foo(); 

再一次,你不能設置一個繼承它所有孩子功能的類。 這不是面向對象編程的工作原理。