在CakePHP中,parent::initialize()做什么?

在CakePHP中,parent::initialize()做什么?,cakephp,cakephp-3.0,Cakephp,Cakephp 3.0,我明白了 parent::initialize(); 在CakePHP3.x和所有3.x文档中的所有预加载方法中 删除该行,或者忘记将该行添加到新方法中,似乎没有任何负面影响 这就引出了一个问题:它有什么作用 抱歉,这是一个完全没有问题的问题。在控制器的initialize()方法中,您可以定义要加载的任何组件,以及 它们的配置数据: public function initialize() { parent::initialize(); $this->loadCompone

我明白了

parent::initialize();
在CakePHP3.x和所有3.x文档中的所有预加载方法中

删除该行,或者忘记将该行添加到新方法中,似乎没有任何负面影响

这就引出了一个问题:它有什么作用


抱歉,这是一个完全没有问题的问题。

在控制器的
initialize()
方法中,您可以定义要加载的任何组件,以及 它们的配置数据:

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

在控制器的
initialize()
方法中,可以定义要加载的任何组件,以及 它们的配置数据:

public function initialize()
{
   parent::initialize();
   $this->loadComponent('Security');
   $this->loadComponent('Paginator');
   $this->loadComponent('RequestHandler');
} 
它调用同名的父方法

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

Bclass extends Aclass {
    public function foo() { parent::foo(); echo 'foobar'; }
}
只要尝试一下并删除父调用,您就会看到它的作用。通常应该调用父级,特别是在initialize()回调之类的方法中。然而,何时打电话或不打电话是你必须做出的决定。这取决于您是否希望或需要调用父方法逻辑。这称为“过载”

这允许您在方法的父调用之前或之后添加功能,这是一件非常常见的事情。我建议您使用php手册的一部分。

它调用相同名称的父方法

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

Bclass extends Aclass {
    public function foo() { parent::foo(); echo 'foobar'; }
}
只要尝试一下并删除父调用,您就会看到它的作用。通常应该调用父级,特别是在initialize()回调之类的方法中。然而,何时打电话或不打电话是你必须做出的决定。这取决于您是否希望或需要调用父方法逻辑。这称为“过载”


这允许您在方法的父调用之前或之后添加功能,这是一件非常常见的事情。我建议您阅读php手册。

这正是它所说的从父类运行方法。例如,美国

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
    }

}

这正是它所说的从父类运行方法。例如,美国

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
    }

}

当您删除它时,它不会做任何事情,因为父级初始化函数中没有任何内容,但是它就在那里,以防您想将功能从父级控制器扩展到子级控制器。例如:

在AppController中,有一个beforeFilter函数,用于定义在加载页面之前要运行的内容。假设我希望在每个页面上都运行一个函数—如果用户未登录,则使用一个简单的重定向函数:

if (!$this->Auth->user()) {
    $this->redirect('Users/login');
}
我可以将它放在AppController的beforeFilter中,而不是将它放在每个控制器上的beforeFilter中

我的其他控制器,如UsersController,从AppController扩展而来:

class UsersController extends AppController {
因此,在myUsersController中的beforeFilter中,我可以执行以下操作:

public function beforeFilter(Event $event) {
    parent::beforeFilter($event);
}
现在,我从父控制器(AppController)继承了此重定向行为,因此,相同的代码也会在我的子控制器(UsersController)中运行。-无论用户去哪个控制器,如果他们没有登录,他们都会被重定向到登录页面

这与parent::initialize()的工作方式相同;您正在继承父控制器中的initialize函数中存在的功能。这只是为了消除冗余代码而包含的功能


所以,基本上,如果您在每个页面上都看到了您正在使用的代码,请找到一种方法,将其删除并放置在您的代码可以从中继承的文件中,使其具有一点面向对象的特性。这与将页眉和页脚代码从HTML文档中移出,并将它们放在它们自己的php文件中的做法相同,因此您可以在一个区域进行更改,并更新所有受影响的衍生工具,而不是编辑每个HTML文档中的页眉和页脚。

删除它时,它不会做任何事情,因为父级初始化函数中没有任何内容,但它存在于那里,以防您希望将功能从父级控制器扩展到子级控制器。
。例如:

在AppController中,有一个beforeFilter函数,用于定义在加载页面之前要运行的内容。假设我希望在每个页面上都运行一个函数—如果用户未登录,则使用一个简单的重定向函数:

if (!$this->Auth->user()) {
    $this->redirect('Users/login');
}
我可以将它放在AppController的beforeFilter中,而不是将它放在每个控制器上的beforeFilter中

我的其他控制器,如UsersController,从AppController扩展而来:

class UsersController extends AppController {
因此,在myUsersController中的beforeFilter中,我可以执行以下操作:

public function beforeFilter(Event $event) {
    parent::beforeFilter($event);
}
现在,我从父控制器(AppController)继承了此重定向行为,因此,相同的代码也会在我的子控制器(UsersController)中运行。-无论用户去哪个控制器,如果他们没有登录,他们都会被重定向到登录页面

这与parent::initialize()的工作方式相同;您正在继承父控制器中的initialize函数中存在的功能。这只是为了消除冗余代码而包含的功能


所以,基本上,如果您在每个页面上都看到了您正在使用的代码,请找到一种方法,将其删除并放置在您的代码可以从中继承的文件中,使其具有一点面向对象的特性。将页眉和页脚代码从HTML文档中移出,并将它们放在自己的php文件中,这样您就可以在一个区域进行更改并更新所有受影响的衍生工具,而不是在每个HTML文档中编辑页眉和页脚。

抱歉,我没有意识到我从未为此选择过答案。一年后,我知道这个问题有多愚蠢。(但我真的很感谢所有花时间回答的人!)抱歉,我没有意识到我从来没有为此选择过答案。一年后,我知道这个问题有多愚蠢。(但我真的很感谢所有花时间回答这个问题的人!)