2015-04-27 101 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中编辑页眉和页脚文件。

相关问题