有没有办法重新分配$ this?

Jas*_*onS 4 php oop composition

首先,我不想扩展课程.我理想的是喜欢这样做.

public function __construct() {
 /* Set Framework Variable */
 global $Five;
 $this =& $Five;
}
Run Code Online (Sandbox Code Playgroud)

我有一个系统,其中变量$ Five是一个包含其他库的容器类.我可以将它分配给一个局部变量Five ...即

public function __construct() {
 /* Set Framework Variable */
 global $Five;
 $this->Five = $Five;
}
Run Code Online (Sandbox Code Playgroud)

但是,我试图避免这种情况的原因是函数调用会变得有点长.

$this->Five->load->library('library_name');
Run Code Online (Sandbox Code Playgroud)

它有点难看.会好得多.

$this->load->library('library_name');
Run Code Online (Sandbox Code Playgroud)

什么是最好的解决方案?

Tyl*_*ter 5

我觉得

$this->Five->load->library('library_name');
Run Code Online (Sandbox Code Playgroud)

除非你决定让类扩展帮助类,否则它将是你最好的选择.AKA

class Something extends Helper_Class
Run Code Online (Sandbox Code Playgroud)

但是,这意味着Helper_Class每次实例化一个类时都会实例化.


另一种方法是使用伪静态类将所有辅助类分配给类成员

public function setGlobals($five)
{
    $this->loader = $five->loader;
}
Run Code Online (Sandbox Code Playgroud)

然后就叫它

public function __construct($five)
{
    someClass::setGlobals($five);
}
Run Code Online (Sandbox Code Playgroud)

如果$Five是全局的,你可以只在global $Five每次想要使用它时,但把它放在每个函数的顶部看起来就像编码错误.


另外,我只想做我的公共服务公告,全局变量通常是一个坏主意,你可能想要搜索'依赖注入'或全局变量的替代.AKA

public function __construct($five);
Run Code Online (Sandbox Code Playgroud)

代替

global $five;
Run Code Online (Sandbox Code Playgroud)

Globals依赖于外部变量存在并且已经设置,而依赖注入请求一个变量,它假定它是Five类的一个实例.

如果你运行PHP 5.1(感谢Gordon),你可以确保变量是FiveClass这样做的一个实例:

public function__construct(FiveClass $five);
Run Code Online (Sandbox Code Playgroud)