当我找到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?为什么?
因为在你的我不能这样做:
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会很痛苦.安全编码意味着减少压力.