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

时间:2010-01-14 20:14:50

标签: php oop composition

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

public function __construct() {
 /* Set Framework Variable */
 global $Five;
 $this =& $Five;
}

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

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

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

$this->Five->load->library('library_name');

它有点难看。会好得多。

$this->load->library('library_name');

最佳解决方案是什么?

7 个答案:

答案 0 :(得分:5)

我认为

$this->Five->load->library('library_name');
除非你决定让类扩展帮助类,否则

将是你最好的选择。 AKA

class Something extends Helper_Class

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


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

public function setGlobals($five)
{
    $this->loader = $five->loader;
}

然后就叫它

public function __construct($five)
{
    someClass::setGlobals($five);
}

如果$Five是全局的,那么每次您想要使用它时都可以global $Five,但将它放在每个函数的顶部只是看起来很糟糕。


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

public function __construct($five);

而不是

global $five;

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

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

public function__construct(FiveClass $five);

答案 1 :(得分:2)

$ this是对您定义的类的当前实例的引用。我不相信你可以分配给它。如果Five是全球性的,你应该能够做到这一点:

$Five->load->library('library_name');

答案 2 :(得分:1)

您可能希望采用某种依赖注入模式的实现:

  

计算机中的依赖注入(DI)   编程指的是过程   为a提供外部依赖   软件组件。这是具体的   形式的控制反转的地方   被忽视的问题是这个过程   获得所需的依赖。

另见documentation for the symfony DI container。如果你想改进处理'全局变量'的方式,我强烈推荐这个DI容器实现。

您还可以阅读this question“访问全局对象的最佳方法”。

答案 3 :(得分:1)

如何制作五个静态类成员的相关数据成员和方法?此

$this->Five->load->library('library_name');

会成为这个

Five::load->library('library_name');

你无需在任何地方传递& $ Five。

答案 4 :(得分:1)

你不能覆盖$ this(例如在C ++中),但你可以使用aggregate为方法调用轻松地构建__call(),为属性调用__get(),__ set(),__ isset()。 / p>

__call()的示例:

class Five {
  public function bar() {
    echo __METHOD__, " invoked\n";
  }
}

class Foo {
  protected $Five = null;

  public function __construct(Five $five=null) {
     if ( is_object($five) ) {
       $this->Five = $five;
     }
   }

  public function __call($name, $args) {
    // there's no accessible method {$name} in the call context
    // let's see if there is one for the object stored in $five
    // and if there is, call it.
    $ctx = array($this->Five, $name);
    if ( !is_null($this->Five) && is_callable($ctx) ) {
      return call_user_func_array($ctx, $args);
    }
    else {
      // ....
    }
  }
}

$foo = new Foo(new Five);
$foo->bar();

打印Five::bar invoked
在我看来,最大的缺点是,从外部看到对象的能力要困难得多。

答案 5 :(得分:0)

我很确定你不能重新分配$this,因为它是PHP中变量看起来像变量的特殊事物之一,但在幕后却略有不同。

如果您的问题是调用时间太长的方法的语义,我会使load方法调用而不是对象属性

$this->load()->library('library_name');

public function load()
{
    return $this->Five;
}

答案 6 :(得分:0)