2012-11-09 3 views
0

내 이해가 올바른지 궁금합니다.함수의 데이터베이스 매개 변수 __construct

데이터베이스 연결 매개 변수를 __construct()에 배치 했으므로 클래스를 인스턴스화 할 때마다 데이터베이스에 다시 연결됩니다. 그렇습니까?

private $handle; 
public function __construct() 
{ 
    $username = "test"; 
    $password = "9712nc*<?12"; 
    $host = "localhost"; 
    $db = "miner"; 
    $dsn = 'mysql:dbname='.$db.';host='.$host; 
    try { 
    $this->handle = new PDO($dsn,$username,$password); 
    } 
    catch(PDOException $e) { 
    print $e->getMessage(); 
    die(); 
    } 
} 

특정 사용자로부터 많은 요청을받는 것이 좋습니다. 사용자가 요청할 때마다 (즉, 요청이 방금 완료 되더라도) 스크립트가 먼저 데이터베이스에 연결해야한다는 의미입니까? 내 $handle을 보존 할 수있는 적절한 방법이 있습니까?

현재 : 데이터베이스 연결이 정상적으로 작동합니다.

답변

1

클래스가 한 번 인스턴스화 된 경우에는 정상적으로 작동합니다. 이 경우 하나의 연결 만 엽니 다.

클래스를 여러 번 인스턴스화하거나 정적 클래스로 사용하면 매번 연결을 만들 수 있으므로 이상적이지는 않습니다.

클래스를 모두 활성화 된 상태로 유지하면 (예 : 클래스를 생성하고 나면 클래스에 대한 참조를 절대 삭제하지 않습니다. 메모리를 테스트 한 적이 없습니다.) PHP의 내부 구조가 실제로 이것을 정렬해야합니다. 여전히 데이터베이스에 하나의 연결 만 있습니다. 그러나 생성 한 클래스에 대한 핸들을 잃어 버리면 PDO가 파괴되고 다시 시작됩니다. 정적 클래스 (예 : class:function())로 사용하는 경우, , 당신은 두 가지 일반적인 해결책이 있습니다


. 잘못된 경로에있어, 당신과 그들 모두에 대해 가지 인자를 찾을 수 있습니다.

,536,

1) DB 연결을 저장하기 위해 전역을 사용하십시오. $ handle = PDO를 만들고 전역 변수로 $ handle을 저장합니다. 쉽게 지나칠 수 있습니다. 덮어 쓰기 쉬움 - 여기서 논쟁하지 않을 것입니다.

2) "정적"클래스 (일반적으로 싱글 톤이라고 함)를 리콜하십시오. 기본적인 구조는

private static $ThisObj; 
private static $handle; 

public static function getInstance() { 
    if(!(self::$ThisObj instanceof SoapDB)) { 
     self::$ThisObj = new SoapDB(); 
     try { 
      $this->handle = new PDO_Handler('mysql:dbname=' . DB_NAME . ';host=' . DB_HOST, DB_USER, DB_PASS); 
      $this->handle->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     } catch (PDOException $e) { 
      // Error Here 
     } 
    } 
    return self::$ThisObj; 
} 

입니다. 이것을 사용하면 일반적으로 별도의 DB 클래스를 싱글 톤으로 생성하게됩니다. 싱글 톤 대 글로벌 사용 : 당신의 전화 (연구 후).

3) 세 번째 대답은 위의 클래스를 정적 ​​(예 : class::function())이라고 부르는 경우 $ 핸들을 정적으로 만 만들 수 있으며 문제는 훌륭하게 해결되어야합니다. 기본적으로 데이터베이스를 속성 중 하나로 사용하여 싱글 톤을 만듭니다.

잘못되었거나 옳은 답변이 아쉽습니다. 의견에 따라


편집 "무엇 정적 클래스의"

은 엄밀히 말하면, 나는 "는 정적 속성을 가진 클래스"를 말해야한다. 설명하기 위해, 일반적으로 당신은 구문을 사용하여 클래스를 생성 :

$myClass = new class(); 
$methodResult = $myClass->method(); 

다음은 $myClass와 함께 멋진 작은 것들을 많이 할 함수를 호출하여.그런 다음 클래스에 대한 참조를 삭제하고 속성 (변수)을 잃어 버리고 나중에 다시 초기화 할 수 있습니다.

정적 유형 (이 대답의 목적)은 정적 속성이있는 유형입니다. 일반적으로 (절대적으로는 아님) 그들은가는 것으로 불린다.

$methodResult = class::method(); 

당신은 수업을 계속하지 않습니다. 수업을 시작하고, 사용하고, 삭제합니다. 그러나 속성 (var 초)을 정적으로 저장하면 해당 클래스를 사용할 때마다 해당 속성이 마지막 상태로 유지됩니다. 따라서 method$this->MyVar = 'something'으로 설정할 수 있으며 다음 번에는 $ this-> MyVar가 여전히 무언가입니다.

코드를 분류하는 데 매우 유용하며 다른 사람을 덮어 쓰는 기능을 중지하고 단위 테스트를 더 쉽게 만들 수 있습니다.

(주 -.. 내가 간단하게 일반화하고 있습니다 그러나 그것은 당신에게 프로세스의 아이디어를 줄 것이다)

+0

덕분에, 나는 문제가 몇 가지 용어를 이해 있습니다. 이 "정적 클래스"란 무엇입니까? – fishcracker

+0

Shoud 내가 쿼리를 수행 할 때마다 다른 함수 내에서'getInstance'를 호출합니까? – fishcracker

+0

@fishcracker - "정적 클래스"에 대한 예제를 추가했습니다. 만약 당신이'getInstance'를 사용한다면 당신은 싱글 톤 라우트를 사용합니다 : 범위 내에서 데이터베이스를 다시 얻을 필요가있을 때마다 단지'getInstance'를 호출하면됩니다 - 함수 당 한번, 그러나 쿼리를 할 때마다. – Robbie

관련 문제