【问题标题】:silverstripe init() function银条初始化()函数
【发布时间】:2015-01-15 20:29:40
【问题描述】:

谁能在Silverstripe中解释这段代码:

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

init函数到底是什么?

什么parent::init();

完全在代码中实现

【问题讨论】:

  • 它从父类调用静态init()函数,如果这回答了你的问题?!​​
  • init()是属于silverstripe还是php知识库?
  • 这是来自silverstripe的函数,问题回答了吗?
  • 是的,我想知道在哪里可以阅读此功能的确切作用。但我不知道在哪里看。有教程吗
  • 这里是Controller类的api文档,其中包含init()函数:api.silverstripe.org/3.1/class-Controller.html

标签: php silverstripe


【解决方案1】:

在php类中,当你覆盖父类的方法时,你仍然可以用这段代码调用父类,它会帮助你在真正的方法的开头放置一些代码而不删除它。

您可以在php documentation 了解更多信息

【讨论】:

  • 这是否意味着 init() 是父类的方法,我通过声明我的函数/公共函数 init() / 来覆盖它/但我在那个名为方法 parent::init() 的函数中来自高阶阶级?
  • 是的,所以主要的 init() 方法会起作用,但在此之前你需要做一些事情
【解决方案2】:

最上面的 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 类 - 工作方式与上述相同。

【讨论】:

  • 我真的推荐使用像 PHPStorm 这样的 IDE 来移动 Silverstripe 核心代码。您只需 CTRL+单击 parent::init() 行中的 init() 方法,它就会跳转到 IDE 中 ContentController 类的 init() 方法...再次您可以 CTRL+单击 init( ) 方法在 parent::init() 行中,它会跳转到 Controller 类的 init() 方法。这是在不同的类、方法等之间跳转的一种非常快速的方式......它还有助于理解 Silverstripe 中的类层次结构,或者在任何 PHP 项目中。
猜你喜欢
  • 1970-01-01
  • 2011-09-04
  • 2021-07-08
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
  • 2016-01-19
  • 2022-01-01
  • 1970-01-01
相关资源
最近更新 更多