2015-12-09 63 views
-1

我知道抽象類僅用於父類,不能擁有自己的實例,但什麼是抽象函數/方法?他們有什麼用途?他們什麼時候使用(例子)?以及它們的範圍(公共,私人,受保護)是如何工作的?什麼是PHP中的「抽象」函數,以及它們何時被使用?

以下面的代碼爲例。

abstract class parentTest{ 

    //abstract protected function f1(); 
    //abstract public function f2(); 
    //abstract private function f3(); 

} 

class childTest extends parentTest{ 
    public function f1(){ 
     echo "This is the 'f1' function.<br />"; 
    } 

    public function f2(){ 
     echo "This is the 'f2' function.<br />"; 
    } 
    protected function f3(){ 
     echo "This is the 'f3' function.<br />"; 
    } 
} 

$foo = new childTest(); 
$foo->f1(); 
+0

抽象類是一樣的界面類,你還定義了一些方法。 http://php.net/abstract –

+2

我建議你閱讀一些關於在PHP或一般的OOP編程入門教程。這個問題在那裏可以肯定地回答。包括例子。 – arkascha

回答

2

抽象函數是定義超級(抽象)類中的契約的方法簽名。該合同必須由任何子類實現。方法實現在子類中的可見性必須與超類相同或者更少限制。請看看Class Abstraction - PHP Manual

注意:可見性與作用域不同。可見性是關於數據隱藏在OOP中的。範圍更一般。這是關於在代碼中定義變量的地方。

0

當您想要在繼承實例之間共享方法時,理論上會使用抽象方法。例如,假設你有一個代表景觀的抽象類,每一個繼承類將有渲染的東西,你可以在父抽象類中定義的方法,所有的孩子將有機會獲得它:

abstract class Template { 
    public function render($template) { 
     include($template); 
    } 
} 
class SiteView extends Template { 
    protected $title = "default title"; 
} 
$siteView = new SiteView(); 
$siteView->render('path/to/site/template.html'); 

爲了改善這一點,你也可以使用一個接口和啓動類型暗示你的類:

interface Renderer { 
    public function render($template); 
} 
abstract class Template implements Renderer { 
    public function render($template) { 
     include($template); 
    } 
} 
class SiteView extends Template { 
    protected $title = "default title"; 
    protected $body= "default body"; 
} 
class Controller { 
    private $view; 
    public function __construct(Renderer $view) { 
     $this->view = $view; 
    } 
    public function show() { 
     $this->view->render('path/to/site/template.html'); 
    } 
} 
$siteView = new SiteView(); 
$controller = new Controller($siteView); 
$controller->show(); 

注意如何事後控制器從抽象和具體類脫鉤,而抽象類可以讓你分享渲染函數與繼承Views。如果您決定創建其他表示其他呈現內容的抽象類,控制器將繼續工作。

的記載,範本看起來像:

<!DOCTYPE html> 
<html> 
<head> 
    <title><?= $this->title ?></title> 
</head> 
<body><?= $this->body ?></body> 
</html> 
相關問題