2015-04-27 96 views

回答

2

It is simple OOP.它調用同名的父方法。

Aclass { 
    public function foo() { echo 'bar'; }; 
} 

Bclass extends Aclass { 
    public function foo() { parent::foo(); echo 'foobar'; } 
} 

只要嘗試一下並刪除父呼叫,就會看到它的作用。父母通常應該被調用,特別是在初始化()回調等方法中。但是,何時打電話或不打電話是您必須做出的決定。這取決於你是否想要或需要調用父方法邏輯或不。這被稱爲「超載」。

這使您可以在方法的父調用之前或之後添加功能,這是很常見的事情。我建議你到read the OOP chapter的PHP手冊。

+0

道歉,我沒有意識到我從來沒有選擇這個答案。一年後,我可以看到多麼愚蠢的狗屎問題。 (但我真的很感激所有花時間回答的人!) –

+0

哈哈,謝謝,並且歡迎。 ;) – burzum

1

在控制器的initialize()方法,你可以定義要加載的任何部件,併爲他們任何 配置數據:

public function initialize() 
{ 
    parent::initialize(); 
    $this->loadComponent('Security'); 
    $this->loadComponent('Paginator'); 
    $this->loadComponent('RequestHandler'); 
} 
1

正是它說你從父類運行一個方法。所以例如。

class AppController extends Controller { 

    public function initialize() { 
     echo 'hello world'; 
     // do more sh*t 
    } 



} 


class UsersController extends AppController { 

    public function initialize() { 

     parent::initialize(); // this will run the method initialize from app controller that will echo 'hello world' 
     // do more sh*t 
    } 

} 
1

它沒有做任何事情,當你刪除它,因爲沒有什麼母公司內部的初始化功能,但它的存在,以防萬一你想從你的父母控制功能擴展到子控制器。例如:

在AppController中有一個beforeFilter函數,它定義了在頁面加載之前要運行的內容。比方說,我希望有一個功能,每一個頁面上運行 - 一個簡單的重定向功能,如果用戶沒有登錄:

if (!$this->Auth->user()) { 
    $this->redirect('Users/login'); 
} 

而不是把這個在beforeFilter上每一個控制器我去的,我可以把它放在AppController的beforeFilter裏面。

我的其他控制器,比如UsersController,從AppController的擴展:

class UsersController extends AppController { 

所以在beforeFilter在我UsersController我可以這樣做:

public function beforeFilter(Event $event) { 
    parent::beforeFilter($event); 
} 

現在我從繼承這個重定向行爲父控制器(AppController),,這樣相同的代碼也運行在我的子控制器(UsersController) - 無論控制器用戶去哪裏,他們都會得到指向登錄頁面,如果他們沒有登錄。

這對於parent :: initialize()方法是一樣的。您繼承了父控制器中初始化函數內存在的功能。這只是用於消除冗餘代碼的功能。所以基本上,如果你看到你在每一頁上使用的代碼,找到一種方法使它成爲一個面向對象的方法,把它移除並放入你的代碼可以繼承的文件中。它將HTML和HTML文檔中的頁眉和頁腳代碼放在一起,並將它們放在自己的PHP文件中,這樣您就可以在一個區域中進行更改,並更新所有受影響的派生代碼,而不是在每個HTML中編輯頁眉和頁腳文件。

相關問題