4

首先,我不想扩展一个类。理想情况下,我想这样做。

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

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

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

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

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

它有点丑。会更好。

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

什么是最好的解决方案?

4

7 回答 7

5

我觉得

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

除非您决定让该类扩展助手类,否则这将是您的最佳选择。又名

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每次你想使用它的时候使用它,但是把它放在每个函数的顶部看起来就像是糟糕的编码。


另外,我只想发布我的公共服务公告,全局变量通常是一个坏主意,您可能想要搜索“依赖注入”或全局变量的替代方法。又名

public function __construct($five);

代替

global $five;

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

如果您正在运行 PHP 5.1(感谢 Gordon),您可以通过执行以下操作确保变量是 的实例FiveClass

public function__construct(FiveClass $five);
于 2010-01-14T20:19:26.270 回答
2

$this 是对您正在定义的类的当前实例的引用。我不相信你可以分配给它。如果 Five 是一个全局变量,您应该能够这样做:

$Five->load->library('library_name');
于 2010-01-14T20:17:35.087 回答
1

您不能覆盖 $this(例如在 C++ 中),但您可以使用__call()进行方法调用和使用 __get()、__set()、__isset()轻松构建聚合。

__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
在我看来,最大的缺点是很难“从外部”看到物体的能力。

于 2010-01-14T20:32:54.243 回答
1

您可能想要使用某种依赖注入模式的实现:

计算机编程中的依赖注入 (DI) 是指向软件组件提供外部依赖的过程。它是一种特定形式的控制反转,其中反转的关注点是获得所需依赖关系的过程。

另请参阅symfony DI 容器的文档。如果您想改进处理“全局变量”的方式,我强烈推荐这个 DI 容器实现。

您还可以阅读有关“访问全局对象的最佳方法”的这个问题。

于 2010-01-14T20:23:47.397 回答
1

制作五个静态类成员的相关数据成员和方法怎么样?这个

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

会变成这样

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

而且您不必到处传递 &$Five 。

于 2010-01-14T20:27:06.767 回答
0

也许对您来说更好的是使用 PHP 魔术方法? http://www.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.methods

于 2010-01-14T20:41:55.147 回答
0

我很确定您不能 reassign $this,因为它是那些看起来像 PHP 中的变量的特殊事物之一,但在幕后的处理方式略有不同。

如果您担心方法调用的语义太长,我会进行load方法调用而不是对象属性

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

public function load()
{
    return $this->Five;
}
于 2010-01-14T20:26:04.430 回答