1

我正在用 PHP 编写某种应用程序,开发人员可以在其中编写自己的插件。就目前而言,每个插件构造函数对象$project都作为参数传递(当然是通过引用)。例如新插件如下所示:

<?php

namespace Plugins;

class newPlugin {
    private $project;
    public function __construct(\Project $project) {
        $this->project = $project;
    }

    public function Something() {
        echo $this->project->template->name();
    }

}

?>

我正在重写它,所以每个新插件都扩展了“标准”插件。在这种情况下,我可以制作一个标准的构造函数,它保存$project在本地传递为$this->project,并且开发人员可以编写更少的内容。但是,每个开发人员都必须记住,有类似 $this->project...

例如:

<?php

namespace Plugins;

class newPlugin extends Plugin { // constructor is now in plugin class

    public function Something() {
        echo $this->project->template->name(); 
        // where should the developer know from that $this->project exists?
    }

}

?>

我可以以某种方式使符号更容易吗?缩写$this->project我想在 parent 中创建一个方法 project() 将返回$this->project。在这种情况下只能project()->template->name();使用。但这……根本不是我认为的最好的。

我希望我的问题中的一切都清楚,如果没有,请在评论中提问。我搜索了可能的答案,但一无所获。

PHP“使用”很棒,但仅适用于命名空间......

BTW,下面还有很多很多其他变量$this->project available,但开头$this->project总是一样的。例如:$this->project->template->name(); $this->project->router->url(); $this->project->page->title();etc... 这个命名标准是强加的,所以没有办法改变它。

$this->project但是,当您每次需要从某个地方获取一个简单变量时都必须编写时,这真的很烦人。

谢谢你的帮助。

4

1 回答 1

2

__get()这是使用重载的项目的简单版本:

<?php

class Template
{
  public function name()
  {
    return 'Template';
  }
}

class Project
{
  public $template;

  public function __construct(Template $template)
  {
    $this->template = $template;
  }
}

class Plugin
{
  public $project;

  public function __construct(Project $project)
  {
    $this->project = $project;
  }

  // here it is. It will be called, if $template property doesn't exist in this Plugin.
  public function __get($val)
  {
    return $this->project->$val;
  }
}

class newPlugin extends Plugin { // constructor is now in plugin class

    public function Something() {
        echo $this->template->name(); // using this we will call __get() method because $template property doesn't exist. It will be transformed to $this->project->template->name();
    }
}

$template = new Template();
$project = new Project($template);
$plugin = new newPlugin($project);

$plugin->Something();

输出:

Template
于 2014-03-30T12:16:13.857 回答