클래스가 한 번 인스턴스화 된 경우에는 정상적으로 작동합니다. 이 경우 하나의 연결 만 엽니 다.
클래스를 여러 번 인스턴스화하거나 정적 클래스로 사용하면 매번 연결을 만들 수 있으므로 이상적이지는 않습니다.
클래스를 모두 활성화 된 상태로 유지하면 (예 : 클래스를 생성하고 나면 클래스에 대한 참조를 절대 삭제하지 않습니다. 메모리를 테스트 한 적이 없습니다.) 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가 여전히 무언가입니다.
코드를 분류하는 데 매우 유용하며 다른 사람을 덮어 쓰는 기능을 중지하고 단위 테스트를 더 쉽게 만들 수 있습니다.
(주 -.. 내가 간단하게 일반화하고 있습니다 그러나 그것은 당신에게 프로세스의 아이디어를 줄 것이다)
덕분에, 나는 문제가 몇 가지 용어를 이해 있습니다. 이 "정적 클래스"란 무엇입니까? – fishcracker
Shoud 내가 쿼리를 수행 할 때마다 다른 함수 내에서'getInstance'를 호출합니까? – fishcracker
@fishcracker - "정적 클래스"에 대한 예제를 추가했습니다. 만약 당신이'getInstance'를 사용한다면 당신은 싱글 톤 라우트를 사용합니다 : 범위 내에서 데이터베이스를 다시 얻을 필요가있을 때마다 단지'getInstance'를 호출하면됩니다 - 함수 당 한번, 그러나 쿼리를 할 때마다. – Robbie