Php:does";“静态”;表现得像C?
我有一个生成db访问的“主类”。比如:Php:does";“静态”;表现得像C?,php,optimization,Php,Optimization,我有一个生成db访问的“主类”。比如: class ObjetBd extends Objet { protected $bd; public function __construct() { parent::__construct(); $this->bd = new BD(); $this->bd->connect(); } } 这对我来说是“干净”的代码(为了简洁起见,我删除了注
class ObjetBd extends Objet
{
protected $bd;
public function __construct()
{
parent::__construct();
$this->bd = new BD();
$this->bd->connect();
}
}
这对我来说是“干净”的代码(为了简洁起见,我删除了注释)
现在我的问题是为每个对象生成$this->bd
我想知道静态对象是否生成并初始化一次
我想调用connect()
一次,并且只使用一个连接,而不使用对静态方法的直接调用(即像以前一样继续使用$this->bd
)
如果是这样的话,请您说明以下代码是否可以完美地工作,以及是否应该使用较少的资源:
class ObjetBd extends Objet
{
static private $bd_static;
protected $bd;
public function __construct()
{
parent::__construct();
if (!isset(self::$bd_static)) {
self::$bd_static = new BD();
self::$bd_static->connect();
}
$this->bd = self::$bd_static;
}
}
是的,你做得对。 忽略singleton注释,避免使用singleton是件好事 虽然我想提个建议: 我假设BD是某种数据库。OOP的强大之处在于能够对事物进行子类化,并在不改变行为的情况下替换对象
因此,最好只在构造函数中传递$bd对象。只是要记住一些事情。这被称为“依赖注入”或“控制反转”。:回形针:看起来你正在实现一个单例模式。请看:D@Nanne我仔细阅读了你的链接。如果你仔细阅读,你会发现它不是一个单一模式(即使快速阅读我的问题可能会产生这样的想法))。我不确定它是否不同?在你的问题中,你似乎暗示你想要一个单一的数据库对象(“生成+初始化一次。”正如你所说)。那不是单身汉吗@埃弗特:我同意可能需要避免单身,但这并不意味着问题不在于他们?因此,不要忽略单例注释,但可以添加一个答案来避开问题(这就是为什么它是注释而不是答案的原因)。它生成并初始化了一次,但它既不像链接中的示例那样声明,也不像链接中的示例那样使用。对不起,你在第一点和第二点上都是对的。我确实同意你对单身的看法。我已经有问题了(不记得什么时候和为什么,但我的经验告诉我你的建议是正确的)。顺便说一句,传递
$bd
意味着所有要使用作为ObjetBd
后代的对象的对象必须有一个$bd
对象提供给构造函数。如果子类有其他方法获取“bd兼容”对象,实际上,您可以在子类中省略\u构造
方法中的参数。出于某些原因,函数的参数总是强制具有类似的签名,除了构造函数。现在,如果不设置BD类,您无法为此类编写unittest。依赖注入的好处是,您可以插入一个“mock”BD实例。此外,它还可以帮助解决继承问题。。如果使用self::而不是static::