首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PHP基于父类的现有实例创建子类的新实例

PHP基于父类的现有实例创建子类的新实例
EN

Stack Overflow用户
提问于 2018-06-13 10:42:01
回答 2查看 440关注 0票数 1

我知道这会有点奇怪,所以我会尽量简明扼要。

我正在为Grav开发一个插件。我已经确定实现我的目标的最有效的方法是扩展一个基类,Pages。

结构看起来像这样:

  • index.php创建grav类的实例。
  • 基本grav类创建Pages类的实例并将其存储为服务。
  • 在grav类完成加载过程后,index.php告诉grav在其服务上运行进程class.
  • PagesProcessor在存储的页面上运行init()函数grav会触发一个事件,表示页面已被index.php接收事件。

这在实际中是什么样子的。

  1. index.php

$grav = Grav::instance( array( 'loader‘=> $loader ) );

  • Grav.php

受保护的静态$diMap = .....'pages‘=> 'Grav\Common\Page\Pages','pagesProcessor’=>‘Grav\Common\Processor\PagesProcessor’,.....;受保护的$processors = .....‘'pagesProcessor',.....;公共静态函数实例(数组实例= []) { if (!self::$ $values ){ self::$instance = static::load($values);.....return self::$instance;}受保护静态函数加载(数组$values) { $container =新静态($values);.....$container->registerServices($container);return $container;}受保护的函数registerServices() { foreach (self::$diMap as $serviceKey => $serviceClass) { .....$this->registerService($serviceKey,$serviceClass);.....}} protected function registerService($serviceKey,$serviceClass) { $this$serviceKey = function ($c) use ($serviceClass) { return new $serviceClass($c);};}

  • index.php

尝试{ $grav->process();}

  • Grav.php

public function process() { foreach ($ $processor ->$processor as $processor) {$processor= $this$processor;.....$processor->process();.....} .....}

  • PageProcessor.php

公共函数进程(Grav__construct){$this->$container= $container;}公共函数__construct(){ .....$ $this->container->fireEvent('onPagesInitialized',->容器‘pages’->init();新事件([‘pages’=> $this->容器‘pages’]));.....}

  • Finally,Plugin.php

公共静态函数getSubscribedEvents() { return [ 'onPagesInitialized‘=> 'onPagesInitialized',0 ];}公共函数onPagesInitialized(Event $event) { //在此执行操作...}

哇塞。好的。

现在,我想要做的是扩展Pages.php (上面没有列出),这样我就可以修改它的一些本地没有setter的受保护属性。问题是,在grav被初始化之前,没有办法告诉它使用扩展方法。

我总是可以创建一个扩展类的新实例,初始化它,并覆盖现有的实例,但这意味着有效地强制初始化两次,这意味着加倍的处理时间,这是非常无效的。

我想做的事情如下:

Pages.php <-我不能更改此设置:

代码语言:javascript
复制
class Pages
{
    protected $grav;

    protected $instances;

    protected $children;

    protected $routes = [];

    public function __construct(Grav $c)
    {
        $this->grav = $c;
    }
    .....
    public function init()
    {
        .....
        $this->instances = [];
        $this->children = [];
        $this->routes = [];

        $this->buildPages();
    }
    .....

PagesExtended.php <-我的类

代码语言:javascript
复制
class PagesExtended extends Pages
{
    public function __construct(Pages $original)
    {
        // set the properties of this class to the original instance
        parent = $original;
    }

    public function setInstances(Array $newInstances){
        $this->instances = $newInstances;
    }
    .....
}

然后在我的Plugin.php中

代码语言:javascript
复制
public function onPagesInitialized(Event $event) {
    // Do things here...
    $this->grav['pages'] = new PagesExtended($event['pages']);
}

我唯一能想到的另一件事就是某种__call技巧。

所以..。有什么想法?

EDIT

好吧..。我仍然想知道这是否可以做到,但事实证明grav“冻结”了这些服务,所以它们不能被覆盖。现在不是很开心。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-23 07:50:28

事实证明,无论我尝试扩展什么类,在grav环境中都是不可能完成的。它永远不能通过插件来完成,因为那些类被grav“冻结”了。

票数 0
EN

Stack Overflow用户

发布于 2018-06-22 00:33:31

我不知道您真正想要实现什么,但是您的Page自定义方法必须返回一些东西,并且它们在Twig中使用。

我经常把页面的自定义数据放在页面的页眉中。在我的插件中,它获取自定义数据($oldHeader = $page->header()),计算素材,并将最终结果作为自定义新属性($page->header($newHeader))再次添加到Page对象中,然后在Twig中我可以访问并打印出我的页面的这些新数据({{ page.header.data_generated_in_plugin }})。

这样,我可以在不覆盖Page类的情况下做任何事情。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50828370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档