문제

PHP의 데이터베이스 연결 용으로 글로벌 대신 싱글 톤을 사용하면 어떤 이점이 있습니까? 글로벌 대신 싱글 톤을 사용하면 코드가 불필요하게 복잡해집니다.

글로벌 코드

$conn = new PDO(...);

function getSomething()
{
    global $conn;
    .
    .
    .
}

싱글 톤과 함께 코드

class DB_Instance
{
    private static $db;

    public static function getDBO()
    {
        if (!self::$db)
            self::$db = new PDO(...);

        return self::$db;
    }
}

function getSomething()
{
    $conn = DB_Instance::getDBO();
    .
    .
    .
}

글로벌 또는 싱글 톤 이외의 데이터베이스 연결을 초기화하는 더 나은 방법이 있다면, 글로벌 또는 싱글 톤에 대한 장점을 설명하고 설명하십시오.

도움이 되었습니까?

해결책

나는 이것이 오래된 것을 알고 있지만 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();
    .
    .
    .
}

그런 다음 앱이 매우 유명하고 Dugg 및 SlashDotted가 발생한 6 개월 안에 단일 연결 이상이 필요하다고 결정하면 GetConnection () 메소드에서 풀링을 구현하기 만하면됩니다. 또는 SQL 로깅을 구현하는 래퍼를 원한다고 결정하면 PDO 서브 클래스를 전달할 수 있습니다. 또는 모든 호출마다 새로운 연결을 원한다면 그렇게 할 수 있습니다. 단단한 대신 유연합니다.

브레이스를 포함한 16 줄의 코드 라인은 몇 시간, 몇 시간, 몇 시간, 몇 시간 동안 회색의 유사한 것을 절약 할 수 있습니다.

첫 번째 이동 라운드에서 기능 구현을 수행하지 않기 때문에이 "기능 크리프"를 고려하지 않습니다. 국경선 "Future Creep"이지만 어느 시점에서 "오늘 내일 코딩"이라는 생각은 언제나 나쁜 것은 나에게 야기하지 않습니다.

다른 팁

귀하의 구체적인 질문에 답할 수는 없지만 웹 기반 시스템의 경우 글로벌 / 싱글 톤 연결 객체가 최선의 아이디어가 아닐 수도 있다고 제안하고 싶었습니다. DBMS는 일반적으로 효율적인 방식으로 많은 고유 한 연결을 관리하도록 설계되었습니다. 글로벌 연결 객체를 사용하는 경우 몇 가지 작업을 수행하고 있습니다.

  1. 페이지에서 모든 데이터베이스 연결을 순차적으로 수행하고 비동기 페이지로드의 시도를 끊습니다.

  2. 데이터베이스 요소에 필요한 것보다 오래 열린 잠금 장치를 보유하여 전체 데이터베이스 성능이 느려집니다.

  3. 데이터베이스가 총 동시 연결 수를 최대화하면 새로운 사용자가 리소스에 액세스하는 것을 차단할 수 있습니다.

다른 잠재적 결과도 있다고 확신합니다. 이 방법은 사이트에 액세스하는 모든 사용자에 대한 데이터베이스 연결을 유지하려고 시도합니다. 하나 또는 두 명의 사용자 만있는 경우 문제가 아닙니다. 이것이 공개 웹 사이트이고 트래픽을 원한다면 확장 성이 문제가됩니다.

편집하다

더 큰 규모의 상황에서는 데이터 제에 닿을 때마다 새로운 연결을 만들면 나빠질 수 있습니다. 그러나 그 대답은 글로벌 연결을 만들고 모든 것에 대해 재사용하는 것이 아닙니다. 답은 연결 풀링입니다.

연결 풀링을 사용하면 여러 가지 고유 한 연결이 유지됩니다. 응용 프로그램에서 연결이 필요한 경우 풀에서 첫 번째로 이용 가능한 연결이 검색되고 작업이 완료되면 수영장으로 돌아갑니다. 연결이 요청되고 사용할 수있는 두 가지 중 하나가 발생하지 않으면 다음 중 하나가 발생하지 않습니다. a) 허용되는 연결의 최대 수에 도달하지 않으면 새 연결이 열리거나 b) 응용 프로그램이 연결을 사용할 수 있도록 기다려야합니다. .

메모: .NET 언어에서 연결 풀링은 기본적으로 ADO.NET 객체에 의해 처리됩니다 (연결 문자열은 필요한 모든 정보를 설정합니다).

이것에 대해 언급 한 Crad에게 감사드립니다.

싱글 톤 방법은 모든 클래스의 인스턴스 만 있는지 확인하기 위해 만들어졌습니다. 그러나 사람들은 그것을 세계화하는 방법으로 사용하기 때문에 게으르고/또는 나쁜 프로그래밍으로 알려지게됩니다.

따라서 둘 다 실제로 OOP가 아니기 때문에 글로벌 및 싱글 톤을 무시할 것입니다.

당신이 찾고 있던 것은입니다 의존성 주입.

의존성 주입 (예제 포함)과 관련된 PHP 기반 정보를 쉽게 읽을 수 있습니다. http://components.symfony-project.org/dependency-injection/trunk/book/01-dependency-injection

두 패턴 모두 동일한 순 효과를 달성하여 데이터베이스 호출에 하나의 단일 액세스 포인트를 제공합니다.

특정 구현 측면에서 싱글 톤은 다른 방법 중 하나 이상이 요청할 때까지 데이터베이스 연결을 시작하지 않는 작은 이점이 있습니다. 실제로 내가 작성한 대부분의 응용 프로그램에서는 큰 차이가 없지만 데이터베이스 호출을 전혀하지 않는 페이지/실행 경로가 있으면 잠재적 인 장점입니다. 데이터베이스에 대한 연결을 요청하십시오.

또 다른 사소한 차이점 중 하나는 글로벌 구현이 응용 프로그램의 다른 변수 이름보다 의도하지 않게 짓밟을 수 있다는 것입니다. 실수로 다른 글로벌 $ DB 참조를 선언 할 가능성은 거의 없지만 우연히 덮어 쓸 수는 있지만 (예 : if ($ db == null)를 작성하려는 경우 ($ db = null)을 작성할 수 있습니다. 싱글 톤 객체는 그것을 방지합니다.

지속적인 연결을 사용하지 않고 그렇게하지 않는 사례가 있다면, 싱글 톤은 OO 디자인의 글로벌보다 개념적으로 더 맛있다는 것을 알게됩니다.

진정한 OO 아키텍처에서 싱글 톤은 매번 새 인스턴스를 만드는 것보다 효과적입니다.

주어진 예에서는 싱글 톤을 사용할 이유가 없습니다. 경험의 규칙 내 유일한 우려가 객체의 단일 인스턴스를 허용하는 것이면 언어가 허용하는 경우 Globals를 사용하는 것이 좋습니다.

일반적으로 데이터베이스 연결에 싱글 톤을 사용합니다 ... 데이터베이스와 상호 작용해야 할 때마다 새 연결을 만들고 싶지 않습니다 ... 네트워크의 성능과 대역폭을 해칠 수 있습니다 ... 왜 새로운 것, 사용 가능한 하나가있을 때 ... 내 2 센트 만 ...

rwendi

아주 간단합니다. 글로벌 또는 싱글 톤을 사용하지 마십시오.

둘 다 조언으로 하나씩 일어나는 것 그리고 글로벌 유효하며 동일하게 결합 할 수 있습니다 시스템, 프로젝트, 플러그인, 제품 등 ... 제 경우에는 웹 (플러그인) 용 디지털 제품을 만듭니다.

나는 만 사용한다 하나씩 일어나는 것 메인 클래스에서 나는 원칙적으로 그것을 사용합니다. 메인 클래스가 다시 인스턴스화하지 않을 것이라는 것을 알고 있기 때문에 거의 사용하지 않습니다.

<?php // file0.php

final class Main_Class
{
    private static $instance;
    private $time;

    private final function __construct()
    {
        $this->time = 0;
    }
    public final static function getInstance() : self
    {
        if (self::$instance instanceof self) {
            return self::$instance;
        }

        return self::$instance = new self();
    }
    public final function __clone()
    {
        throw new LogicException("Cloning timer is prohibited");
    }
    public final function __sleep()
    {
        throw new LogicException("Serializing timer is prohibited");
    }
    public final function __wakeup()
    {
        throw new LogicException("UnSerializing timer is prohibited");
    }
}

글로벌 거의 모든 2 차 클래스에 사용됩니다. 예 : 예 :

<?php // file1.php
global $YUZO;
$YUZO = new YUZO; // YUZO is name class

런타임에 사용할 수 있습니다 글로벌 기본 제품 클래스의 다른 인스턴스가 필요하지 않기 때문에 동일한 인스턴스에서 방법과 속성을 호출합니다.

<?php // file2.php
global $YUZO;
$YUZO->method1()->run();
$YUZO->method2( 'parameter' )->html()->print();

나는 동일한 클래스의 경우 공장이 필요하지 않기 때문에 글로벌과 동일한 인스턴스를 사용하여 제품을 작동시킬 수있는 것과 동일한 인스턴스를 사용하는 것이 좋습니다. 일반적으로 인스턴스 공장은 대형 시스템 또는 매우 드문 목적입니다.

In conclusion:, 당신은 이미 잘 이해한다면 그것이 반포 란드입니다. 하나씩 일어나는 것 그리고 이해합니다 글로벌, 두 가지 옵션 중 하나를 사용하거나 혼합 할 수 있지만 프로그래밍 OOP에 매우 예외적이고 충실한 프로그래머가 많기 때문에 학대하지 않는 것이 좋습니다. 시각. (많은 CPU를 절약합니다). 😉

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top