php容器类:为什么每个人都使用更复杂的方法?

Tim*_*nen 4 php containers

当我找到php的脚本或查看php框架时,我看到一个"注册表类"或"容器类",它通常使用__get魔术方法保存变量或其他对象.

这是我的意思的简化示例:

例1:

class container {
 private $objects;
 public function __get($class){
  if(isset($this->objects[$class])){
   return $this->objects[$class];
  }
  return $this->objects[$class] = new $class();
 }
}
Run Code Online (Sandbox Code Playgroud)

上面的例子在创建类时会有更多的函数,而不是只调用它,但对于我的例子,它应该就足够了."示例1"是我在从互联网下载的脚本中大多看到的,它维护着一个单独的类实例,现在我想知道的是,这个例子不会做同样的事情并且效率更高:

例2:

class simplecontainer {
 public function __get($class){
  return $this->$class = new $class();
 }
}
Run Code Online (Sandbox Code Playgroud)

但我从未在其他人的剧本中看到"例2",这使我在考虑使用它之前会三思而后行.

我使用它们将包含的几个类来测试容器与简单容器,并且重复使用大约100000次,"示例1"在我的本地机器上以0.75秒进行测试,"示例2"在0.29秒内进行测试.

我应该在我的脚本中使用哪个?例1或例2?为什么?

Mik*_*ike 8

因为在你的我不能这样做:

class container {
    private $foo = "I'm only a var";
    private $objects;
    public function __get($class){
        if(isset($this->objects[$class])){
            return $this->objects[$class];
        }
        return $this->objects[$class] = new $class();
    }
}

class simplecontainer {
    private $foo = "I'm only a var";
    public function __get($class){
        return $this->$class = new $class();
    }
}

class foo {
    public $bar = "wibble";
}

$c1 = new container();
$c2 = new simplecontainer();

$foo = $c1->foo;
$foo->bar = "Don't you forget about me!";
unset($foo);
$foo = $c1->foo;
echo $foo->bar;
// Don't you forget about me!

$foo = $c2->foo;
$foo->bar = "Don't you forget about me!";
unset($foo);   
$foo = $c2->foo;
echo $foo->bar;
// wibble
Run Code Online (Sandbox Code Playgroud)

您的版本依赖于没有类名与容器对象的私有成员相同.好的,所以应该很容易避免,但是追踪一个bug会很痛苦.安全编码意味着减少压力.