银条 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 - 工作方式与上面解释的相同.
有人可以在 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 - 工作方式与上面解释的相同.