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

In CakePHP, what does parent::initialize() do?

我看到线了

parent::initialize();

在 CakePHP 3.x 和所有 3.x 文档中的所有预加载方法中。

删除该行,或忘记为新方法添加该行,似乎没有任何负面影响。

这引出了一个问题,它有什么作用?

抱歉,这是一个完全菜鸟的问题..

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

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

It is simple OOP. 它调用同名的 parent 方法。

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

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

只需尝试并删除 parent 调用,您就会看到它的作用。通常应该调用 parents,尤其是在像 initialize() 回调这样的方法中。但是,何时打电话或不打电话是您必须做出的决定。这取决于您是否想要或需要调用 parent 方法逻辑。这叫做"overloading".

这允许您在方法的 parent 调用之前或之后添加功能,这是很常见的事情。我建议您阅读 php 手册的 read the OOP chapter

这正是它所说的 运行 来自父 class 的方法。例如。

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 {

所以在我的 UsersController 的 beforeFilter 中,我可以这样做:

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

现在我从父控制器 (AppController) 继承了这种重定向行为,所以我的子控制器 (UsersController) 中也有相同的代码 运行 - 而且没有不管用户去哪个控制器,如果他们没有登录,他们都会被重定向到登录页面。

这与 parent::initialize() 的工作方式相同;您正在继承父控制器中初始化函数中存在的功能。这只是用于消除冗余代码的功能。

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