Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php:does";“静态”;表现得像C?_Php_Optimization - Fatal编程技术网

Php:does";“静态”;表现得像C?

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(); } } 这对我来说是“干净”的代码(为了简洁起见,我删除了注

我有一个生成db访问的“主类”。比如:

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::