我在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
,这真的很烦人。
感谢您的帮助。
答案 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