나는 이것이 오래되었다는 것을 알고 있지만 Dr8k의 대답은 거의 다 왔습니다 .
코드 작성을 고려할 때 변경 될 것이라고 가정하십시오. 그것은 당신이 미래의 어느 시점에서 그것에 대한 변화의 종류를 가정하고 있다는 것을 의미하는 것이 아니라 어떤 형태의 변화가 이루어질 것이라는 것을 의미합니다.
미래의 변화에 따른 고통을 덜어주는 목표로 삼으십시오. 글로벌은 단일 지점에서 관리하기가 어렵 기 때문에 위험합니다. 나중에 데이터베이스 연결 컨텍스트를 인식하게하려면 어떻게해야합니까? 5 번 사용할 때마다 자동으로 닫히고 다시 열리도록하려면 어떻게해야합니까? 앱 확장을 위해 10 개의 연결 풀을 사용하기로 결정하면 어떻게됩니까? 아니면 구성 가능한 연결 수?
싱글 공장은 당신에게 그 유연성을 제공합니다. 나는 거의 추가로 복잡하지 않게 설정하고 동일한 연결에 대한 액세스 이상의 것을 얻습니다. 나중에 간단한 방법으로 그 연결이 나에게 전달되는 방식을 변경할 수 있습니다.
나는 단순히 싱글 톤이 아니라 싱글 톤 팩토리 를 말한다 . 싱글 톤과 글로벌, 사실 사이에는 아주 작은 차이가 있습니다. 그렇기 때문에 싱글 톤 연결을 가질 이유가 없습니다. 대신 일반 글로벌을 만들 수 있는데 왜 설정하는 데 시간을 소비하겠습니까?
공장이 당신을 얻는 것은 연결을 얻는 이유이며, 어떤 연결 (또는 연결)을 얻을 것인지를 결정하는 별도의 지점입니다.
예
class ConnectionFactory
{
private static $factory;
private $db;
public static function getFactory()
{
if (!self::$factory)
self::$factory = new ConnectionFactory(...);
return self::$factory;
}
public function getConnection() {
if (!$this->db)
$this->db = new PDO(...);
return $this->db;
}
}
function getSomething()
{
$conn = ConnectionFactory::getFactory()->getConnection();
.
.
.
}
그런 다음 6 개월 동안 앱이 매우 유명하고 더그와 슬래시 점이 찍히고 하나 이상의 연결이 필요하다고 결정하면 getConnection () 메서드에서 풀링을 구현하기 만하면됩니다. 또는 SQL 로깅을 구현하는 래퍼를 원하는 경우 PDO 하위 클래스를 전달할 수 있습니다. 또는 모든 호출에 대해 새로운 연결을 원하면 그렇게 할 수 있습니다. 단단하지 않고 유연합니다.
중괄호를 포함한 16 줄의 코드를 사용하면 몇 시간, 몇 시간, 몇 시간의 리팩토링 시간을 절약 할 수 있습니다.
첫 번째 라운드에서 기능 구현을 수행하지 않기 때문에이 "기능 크리프"를 고려하지 않습니다. "Future Creep"의 경계선이지만 어느 시점에서 "오늘 내일을위한 코딩"이 항상 나쁜 일이라는 생각이 나에게 맞지 않습니다.