2013-12-13 1 views
1

일부 작업을 수행하는 함수를 작성해야하는 경우가 있으며이 작업을 수행하려면 데이터베이스에 연결해야합니다. 함수가 작동하려면 SQL 객체를 호출 할 때 SQL 객체를 전달해야합니다. 여기에 더 잘 설명하기 위해 예입니다함수 인수를 SQL 개체로 건너 뛰기

function get_all_students($db) 
{ 
    $stmt = $db->prepare("SELECT * FROM students"); 
    $stmt->execute(); 
    // and the rest of the code 
} 

문제 :

내가 인수로 $DB을 통과 할 필요없이 함수를 선언하고자합니다. 이 용도로 세션을 사용하지 않는 것이 좋습니다. 내 모든 페이지에서, 맨 위에이기 때문에

이 코드 포함 :

$db = new mysqli(SETTING); 

다음이 정의되어 있기 때문에 기능은 이미 $의 DB를 알고 있어야하지만 그것이 전까지하지 않습니다 인수로 $db이 전달되었습니다.

+1

가변 범위가 작동하는 방식입니다 (http://www.php.net/manual/en/language.variables.scope.php). OOP를 사용하고 있다면 의존성 주입을 권하고 싶지만 단일 함수로 매개 변수로 전달하는 것이 가장 좋은 해결책입니다. – jeroen

답변

1

$ db가 세션이나 전역이 아닌 경우 함수 내에서 범위를 벗어납니다.

이유 : 원하는 방식대로 작동하는 경우, 사용자가 코딩하지 않은 개체를 참조 할 때 해당 변수를 사용하고 해당 변수 값을 변경 한 경우 예기치 않은 동작이 발생합니다. 각 코드 블록은 다른 변수와 독립적이어야합니다. 그렇지 않으면 시스템 함수를 호출 할 때 매우 이상한 동작이 발생하여 사용자와 동일한 변수를 사용할 수 있습니다.

선택 사항은 함수 내에서 데이터베이스 연결 개체를 만들고 소멸 시키거나 그림과 같이 전달하는 것입니다.

+1

좋은 답변입니다. 고마워요. –

1

여러 가지 방법이 있지만 최선의 방법은 단일 패턴 또는 레지스트리 패턴을 사용하는 것입니다.

Check this link

당신은 같은 레지스트리에서 DB 객체를 얻을 수 있습니다 :

Registry::get('db'); 

또는 싱글

Db::GetInstance(); 

를 통해이 "글로벌"방법도 있지만, 나는 그것을 추천하지 않을 것입니다.

+0

'글로벌'과 싱글 톤의 차이점이별로 없습니다. – jeroen

+0

차이가 있습니다. 싱글 톤을 통해 객체에 접근 할 때 더 많은 제어가 가능합니다. 나는 그 싱글 톤이 훌륭하다고 말하지 않지만 솔루션의 하나이며 많은 것이있을 수있다. – Robert