gpt4 book ai didi

php 容器类 : why does everyone use the more complicated method?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:00:02 25 4
gpt4 key购买 nike

当我找到 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();
}
}

上面的例子在创建类时会有更多的功能,而不是仅仅调用它,但对于我的例子来说它应该足够了。“示例 1”是我在从 Internet 下载的脚本中最常看到的方式,它维护一个类实例,现在我想知道的是,这个示例不会做同样的事情并且效率更高:

示例 2:

class simplecontainer {
public function __get($class){
return $this->$class = new $class();
}
}

但我从未在其他人的脚本中看到“示例 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

您的版本不依赖于与容器对象的私有(private)成员相同的类名。好的,所以避免它应该很简单,但是追踪错误会很痛苦。安全编码意味着更少的压力。

关于php 容器类 : why does everyone use the more complicated method?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3715518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com