2011-03-16 5 views
0

하나의 데이터베이스 래퍼 클래스가 있습니다. 다른 클래스에서 쿼리를 실행하려면이 클래스 개체를 어떻게 사용해야합니까?다른 클래스에서 내 데이터베이스 클래스는 어떻게 사용해야합니까?

$liveresellerdb=new Database('host','user','spswd','db'); 
$fetch = $liveresellerdb->getResult($select_resellerData); 

하나의 클래스에 데이터베이스 개체를 어떻게 포함해야합니까?

Class one 
{ 
    function a(){ 
     $sql="select * from table "; 
     //how should i execute here my query i mean to say 
     //every time i can't create the new object 
     // i want to know the good method by which i just execute the query by 
     // giving the database name  
    } 
} 
+0

마지막 질문보다 훨씬 좋은 질문입니다. – RobertPitt

답변

3

(정적 멤버를 사용하는 것은이 패턴의 변형입니다) 대신 Dependency Injection을 사용하는 것이 좋습니다. 즉, 데이터베이스 객체를 생성자를 통해 서비스 (연결을 사용하는 클래스)에 전달합니다.

다음은 예입니다.

class UserFinder 
{ 
    private $db; 

    public function __construct(Database $db) 
    { 
     $this->db = $db; 
    } 

    public function findAllActive() 
    { 
     $sql = 'SELECT * FROM users WHERE active = 1'; 

     return $this->db->executeAndFetchAll($sql); 
    } 
} 

$db = new Database($host, ...); 
$finder = new UserFinder($db); 

$users = $finder->findAllActive(); 

이것은 당신이 데이터베이스 클래스의 특정 구현에 바인딩되지 않도록 (당신은 하위 클래스를 만들 수)과 별도의 Database 경우 별도 UserFinder의를 만들 수 있습니다. 또한 의존성이 적기 때문에 응용 프로그램에 대한 테스트를 작성하는 것이 더 쉽습니다. 종속성은 숨겨지지 않고 대체 가능하지 않기 때문입니다.

요약하자면 : 의존성 주입을 사용하십시오.

+0

하지만 2 3 데이터베이스 인스턴스가 있습니다 – XMen

+0

정확히 하나의 UserFinder 인스턴스가 항상 하나의 데이터베이스 인스턴스에 연결됩니다. – igorw

2

전역 변수가 더러 있기 때문에 (당신은 항상 global $var; 문을 필요), 가장 쉬운 해결책은 클래스, 예를 들면의 정적 멤버에 저장하는 것입니다 Database::$db.

다른 적절한 솔루션 (OOP 환경에서)은 데이터베이스 인스턴스를 클래스에 전달합니다. 코드에서 one의 생성자가 인스턴스를 수락하고 개인 멤버 변수에 저장됩니다.

+0

이 질문을 확인하십시오. http://stackoverflow.com/questions/5324300/while-making-the-static-class-for-database-getting-this-error – XMen

+0

정적 클래스를 사용하면 이점을 알 수 있습니다. oops conceps를 사용할 때의 이점은 무엇입니까? – XMen

2

아마도 Singleton Pattern에 따라 Database 클래스를 구현하는 것이 좋습니다.


업데이트 (아래 언급에 따라) :

좋아. 여기에 단 하나의 제안이 있습니다 (메서드의 매개 변수와 Dependency Injection을 통해 객체를 전달하는 것을 제외하고는 igorw's comment에 설명되어 있습니다) ...

종속성 삽입은 좋은 방법이지만,이 경우에는 데이터베이스의 소량이 있습니다. 그래서 그것들을 모든 정적 인 개인 배열에 저장하고 키로 얻는 것이 더 낫습니다.

공개 정적 메서드 getInstance($key) 만 있으므로 키를 미리 정의 된 상수로 저장할 수 있습니다 ("맞춤법 오류"가 발생하지 않도록).

이렇게하면 초기화가 필요하지 않습니다. (getInstance($key)은 $ key 매개 변수에 따라 [constructor에 전달 된] 필수 매개 변수로 새 Database 객체를 만들 수 있습니다. 의존성 주입은 일반적으로 더 좋아 보이지만 일부 특정 경우에는이 방법을 사용하기가 더 쉽습니다.

+0

하지만 여러 데이터베이스 인스턴스가 필요하다면 여러 데이터베이스에 연결해야한다는 의미입니다. – XMen

+0

그러면 새 데이터베이스 연결을 가져 오거나 만들 수있는 일반 데이터베이스 클래스를 만듭니다. – RobertPitt

1

이름으로 정적 속성에서 데이터베이스 연결을 저장하는 DB를는, setAdapter 방법이 괜찮 수 없습니다 : 그런 다음

Db::setAdapter('db1', 'mysql:host=localhost;dbname=' . $dbname, $user, $pass); 
Db::setAdapter('db2', 'mysql:host=localhost;dbname=' . $dbname2, $user2, $pass2); 

을 필요로 할 때 데이터베이스 연결을 반환하는 대해 getAdapter 방법 :

Db::getAdapter(); // return the default one 
Db::getAdapter('db2'); // return an instance by its name 

뒤에는 게으른 연결을 구현할 수도 있습니다.

관련 문제