類能夠用 abstract 修飾,表示抽象類,抽象類不能直接被實例化。可是,繼承了抽象類的普通類是能夠被實例化的。如:php
//one.php <?php abstract class one { function __construct(){ } } //new one; ?>
實例化的時候會報Fatal error的錯誤。
可是繼承自這個抽象類的方法就能夠被實例化。如:框架
//index.php include 'one.php'; class index extends one { function __construct(){ parent::__construct(); } } $obj = new index;
除了類能夠用 abstract 修飾以外,方法也能被 abstruct 修飾,爲抽象方法。抽象方法真的是很抽象,它並無內容,如:函數
<?php //one.php abstract class one { function __construct(){ } abstract public function test(); //容許帶參數,可是在子類中重寫的時候也必須帶上參數,參數名能夠不一樣 //abstract public function test($param); } //new one; ?>
若是方法被 abstruct 修飾,那麼這個類必須用abstruct,否則就
會報錯。也就是說抽象類能夠有普通的方法,可是抽象方法必須在抽象類裏面定義,而且,若是繼承了這個有抽象方法的抽象類,那麼在你繼承的這個類裏面必須重寫這個方法,不然依然會報錯。如:性能
<?php //index.php include 'one.php'; class index extends one { function __construct(){ parent::__construct(); } //這個方法不重寫就會報錯 public function test(){ echo 'hello'; } //若是抽象的父類中該函數有參數,那麼重寫的時候也要帶上參數 public function test($papapa){ echo 'hello'; } } $obj = new index; ?>
可是抽象類中的抽象方法彷佛不能被定義爲靜態的,定義了以後就報錯。如:code
<?php //one.php abstract class one { function __construct(){ } abstract public function test($param); //定義靜態抽象方法就報錯 static abstract function hello(); } //new one; ?>
<?php //index.php include 'one.php'; class index extends one { function __construct(){ parent::__construct(); } public function test($aa){ echo 'hello'; } //並不能實現 static public function hello(){ echo 'word'; } } $obj = new index; ?>
還有,抽象類是能夠繼承抽象類的,而且不須要重寫父類的抽象方法,它的抽象方法不能和父類的抽象方法同名,他們的關係就像是拓展延伸的關係。如:繼承
<?php //index.php include 'one.php'; abstract class two extends one { abstract public function test1(); //重寫了以後子類無需再重寫 /*public function test(){ }*/ } class index extends two { public function test(){ } public function test1(){ } } $obj = new index; ?>
因爲平時接觸這些也很少,主要都是基於框架開發或者直接在其餘系統上二次開發,對這些稍微底層一點的知識理解的不透徹,在個人理解看來,抽象類和方法主要是用在比較底層的被繼承的類中,供其餘繼承的類去拓展。可是是否對於性能是否有改變就不大清楚了。開發