gpt4 book ai didi

PHP Static v Singleton 类 - ConnectionFactory 解释

转载 作者:搜寻专家 更新时间:2023-10-31 21:13:50 24 4
gpt4 key购买 nike

我是这个级别的 PHP 编程的新手,我一直在阅读一篇关于单例和静态类的文章。我正在编写一个有助于我的数据库连接的类。

我发现了 Jon Raphaelson ( here ) 的以下代码:

class ConnectionFactory
{
private static $factory;
public static function getFactory()
{
if (!self::$factory)
self::$factory = new ConnectionFactory(...);
return self::$factory;
}

private $db;

public function getConnection() {
if (!$this->db) // this line was modified due to comment
$this->db = new PDO(...); // this line was modified due to comment
return $db;
}
}

function getSomething()
{
$conn = ConnectionFactory::getFactory()->getConnection();
.
.
.
}

看起来我已经找到了我要找的东西,但是我有几个问题。

  1. self::$factory = new ConnectionFactory(...); - 我在此类中没有看到构造函数。我是否只创建此构造函数并传入数据库详细信息(“dbname”、“user”、“pass”等)?
  2. getSomething() 函数,我假设其目的是将所有将检索数据的实际函数放在 ConnectionFactory 类中 - 这就是此函数位于这节课。否则,我会期望这个函数在另一个类中。 [edit] 跳过这个问题,我没有看到一个括号。
  3. 当两个用户登录站点并请求数据库连接(都在进行更新等)时会发生什么?这是单例会成为问题吗?

谢谢!

最佳答案

这主要是为了扩展我在问题下的评论...

更好的“单例”模式是这样的:

class ConnectionFactory {

protected static $connection;

public function getConnection() {
if (!self::$connection) {
self::$connection = new PDO(...);
}
return self::$connection;
}

}

这个工厂的用户应该期待它的一个实例,而不是自己调用它:

class Foo {

protected $connectionFactory;

public function __construct(ConnectionFactory $factory) {
$this->connectionFactory = $factory;
}

public function somethingThatNeedsAConnection() {
$connection = $this->connectionFactory->getConnection();
...
}

}

$foo = new Foo(new ConnectionFactory);

这允许 Foo 在需要时获取连接本身,但也允许您将一些替代连接注入(inject) Foo,例如用于测试目的。

作为一种方便的措施并减少实例化的复杂性,这种模式也很好:

class Foo {

protected $connectionFactory;

public function __construct(ConnectionFactory $factory = null) {
if (!$factory) {
$factory = new ConnectionFactory;
}
$this->connectionFactory = $factory;
}

...

}

这仍然允许注入(inject)和覆盖依赖项,但它不需要您在每次实例化 Foo 时都注入(inject)一个工厂。

关于PHP Static v Singleton 类 - ConnectionFactory 解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13381573/

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