银条 init() 函数

silverstripe init() function

有人可以在 Silverstripe 中解释这段代码吗:

public function init() {
    RSSFeed::linkToFeed($this->Link() . "rss");   
    parent::init();
}

init函数到底是什么?

什么parent::init();

在代码中完全正确

in php classes 当你覆盖了父类 class 的方法时你仍然可以用这段代码调用父类 class ,它会帮助你把真正方法开头的一些代码没有删除它。

您可以在 php documentation

找到更多相关信息

控制器中定义了最上面的 init() 方法 class。 然后 ContentController 扩展了 Controller,它覆盖了 Controller class 的 init() 方法,但它还在第一行调用了 parent::init()。然后通常你定义你所有的页面控制器 classes 像这样(对于任何新页面类型),在下面的例子中默认 Page_Controller class:

class Page_Controller extends ContentController {

  public function init() {
    parent::init();

    // do your own stuff here
  }

}

所以这是传统的 PHP 基于 class 扩展机制,但 Silverstripe 还允许您使用扩展和数据扩展,这基本上是扩展已经存在的控制器、数据对象的功能。我不会详细介绍这个......你可以在这里找到更多相关信息:https://docs.silverstripe.org/en/4/developer_guides/extending/extensions/

我的控制器中通常有这样的东西classes:

class Page_Controller extends ContentController {

  public function init() {
    parent::init();

    // do your own stuff here

    $this->extend('updateInit');
  }

}

注意上面的 $this->extend('updateInit'); 行。

我可以在某个 YAML 配置文件中为 Page_Controller class 定义另一个扩展,而不是在 class 中定义 updateInit() 方法。示例:

class Page_Controller_Extension extends Extension {

  public function updateInit() {

    // do some more stuff here

  }

}

...在这种情况下,您将在 YAML 配置文件中拥有类似的内容:

---
Name: siteextensions
After:
  - 'framework/*'
  - 'cms/*'
---

Page_Controller:
  extensions:
    - Page_Controller_Extension

请注意,这并不是真正扩展 classes 的传统方式,就像在 PHP 中那样,它更像是为控制器 class 定义一些装饰器。此外,要引用父级或正在装饰的对象,您不能只使用 $this,您需要使用 $this->owner。下面的示例:

class Page_Controller_Extension extends Extension {

  public function updateInit() {
    // do some more stuff here

    if ($this->owner->IsFeatured) {
      // do something here
    }
  }

}

你通常装饰扩展 Extension class 的控制器,如果你想装饰 DataObjects,你扩展 DataExtension class - 工作方式与上面解释的相同.