silverstripe init()函数

时间:2015-01-15 20:29:41

标签: php silverstripe

有人可以在 Silverstripe

中解释此代码
public function init() {
    RSSFeed::linkToFeed($this->Link() . "rss");   
    parent::init();
}

init函数究竟是什么?

parent::init();

在代码中完全做到了

2 个答案:

答案 0 :(得分:1)

在php类中,当你覆盖父类的方法时,你仍然可以使用这个代码调用父类,它将帮助你在实际方法的开头放一些代码而不删除它。

您可以在php documentation

了解更多相关信息

答案 1 :(得分:0)

最高级的init()方法在Controller类中定义。 然后ContentController扩展了Controller,它覆盖了Controller类的init()方法,但它也在第一行调用了parent :: init()。然后通常你会定义所有你的页面控制器类(对于任何新的页面类型),在下面的示例中为默认的Page_Controller类:

class Page_Controller extends ContentController {

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

    // do your own stuff here
  }

}

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

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

class Page_Controller extends ContentController {

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

    // do your own stuff here

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

}

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

我可以在某个YAML配置文件中为Page_Controller类定义另一个扩展,而不是在该类中定义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

请注意,这并不是传统的扩展类的方法,就像在PHP中一样,它更像是为控制器类定义一些装饰器。此外,要引用父级或正在装饰的对象,您不能仅使用$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类的控制器,如果要装饰DataObjects,则扩展DataExtension类 - 工作方式与上述相同。