PHP:$ this->更简单的开发表示法的缩写

时间:2014-03-30 11:50:16

标签: php methods naming abbreviation

我在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();
    }

}

?>

我正在重写它,所以每个新插件都会扩展&#34; standart&#34;插入。在这种情况下,我可以创建一个标准的构造函数,将$project本地保存为$this->project,开发人员编写的内容较少。 但是,每个开发人员都必须记住,有一些像$ this-&gt; 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我想在父级中创建一个方法project(),它将返回$this->project。在这种情况下,只能使用project()->template->name();。但这是......我认为不是最好的。

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

PHP&#34;使用&#34;很棒,但仅限于命名空间......

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

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

感谢您的帮助。

1 个答案:

答案 0 :(得分: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