2012-11-25 5 views
2

아래와 같은 코드를 생각해보십시오. Lynda.com 에 의해 이런 식으로 데이터베이스 클래스를 만들었습니다. 내 질문에 왜 데이터베이스를 저장하는 대신 정적 메서드를 만들지 않습니다. 정적 속성에 인스턴스가 있습니까?정적 메서드 대 정적 인스턴스

<?php 
class Database { 

    private $conn; 
    private static $init; 

    public function __construct() { 
    $this->conn = new mysqli('localhost','root','root','mydb'); 
    } 

    public static function getInstance() { 
    self::$init = new self(); 
    return self::$init; 
    } 

} 

$db = Database::getInstance(); 

?> 
+2

글로벌 상태와 암시 적 종속성을 생성하므로 두 가지 모두 잘못되었습니다. – ChocoDeveloper

+2

그 코드는'getInstance'에'static' 지정자가 없습니다. 이것을 [싱글 톤 패턴]이라고합니다 (http://stackoverflow.com/questions/4595964/who-needs-singletons). – DCoder

+0

당신의 선생님이 그렇게하신 말씀입니까? 중요한 세부 사항이 빠져 나옵니다. – goat

답변

2

당신이

class DB 
{ 
    private static $instance; 

    private function __construct($args) 
    { 
    // do some 
    } 

    public static function getInstance() 
    { 
    // get instance 
    } 
} 

$query = 'SELECT etc...'; 
$stmt = DB::getInstance()->prepare($query); 

내가 DB 클래스에서이 패턴을 사용) (__construct을 보호하기 위해 당신이해야 싱글 톤을 사용합니다. 그러나 1 개 이상의 연결이 있다면 그렇게해서는 안됩니다! 싱글 톤을 사용하십시오.

0

그냥 명확하게, $db는 정적 메소드 getInstance()를 호출하여 인스턴스화하는 데이터베이스 개체입니다.

왜 데이터베이스에 대한 정적 메서드를 완전히 만들지 않습니까?

정적 메서드는 클래스 내부에서 정의되지만 클래스를 인스턴스화 할 필요없이 호출 할 수 있습니다. 즉, 정적 메서드는 클래스에 속합니다. in은 객체를 인스턴스화하지 않고 호출 할 수 있기 때문입니다.

필요한 경우 데이터베이스와 상호 작용할 수 있도록 데이터베이스 클래스에 메서드를 추가 할 수 있습니다.

+0

정적 메서드를 전적으로 의미하는 경우 생성자 대신 정적 메서드에서 데이터베이스 연결을 만들지 마십시오. –

1

내가 게시 한 코드는 싱글 톤을 의도 한 것처럼 보이기 때문에 다음과 같았습니다. 나는 getInstance() 방법을 변경했습니다.

class Database { 

    private $conn; 
    private static $init; 

    public function __construct() { 
    $this->conn = new mysqli('localhost','root','root','mydb'); 
    } 

    public static function getInstance() { 
    if (is_null(self::$init)) { 
     self::$init = new self(); 
    } 
    return self::$init; 
    } 

} 

$db = Database::getInstance(); 

정적 인스턴스 변수가 왜 사용되는지 혼란 스럽습니다.

싱글 톤을 의도하지 않은 경우 "왜 정적 메서드를 사용하지 않은 것입니까?"라는 질문에는 "있어야 함"이라는 대답이 있어야합니다.

관련 문제