2011-04-28 4 views
3

데이터베이스 클래스 (PHP 용 ADOdb)를 사용하려고하지만 다른 클래스에서 사용하는 방법을 모르겠습니다. 예 :다른 클래스에 포함 된 클래스 사용

<?php 
include_once("adodb.inc.php"); 
$conn = NewADOConnection('mysql'); 

class Contacts { 
    public function getData(){ 
     $conn->Connect(...); 
     //do something 
    } 
} 
?> 

나는 문제는 클래스 외부에서 정의 때문에 나는 $ CONN를 호출 할 수 있다는 것입니다 생각합니다.

공지 사항 : 정의되지 않은 변수 : CONN

치명적인 오류 : 내가 길을 잘못하고 있어요 어쩌면

아닌 객체의 멤버 함수에 연결()를 호출하지만 정말로이 문제를 어떻게 해결해야할지 모르겠다.

누군가 나를 도울 수 있습니까? 고마워요!

말했다
<?php 
include_once("adodb.inc.php"); 
$conn = NewADOConnection('mysql'); 

class Contacts { 
    public function getData(){ 
     global $conn; 
     $conn->Connect(...); 
     //do something 
    } 
} 
?> 

, 당신은 아마 이런 식으로 의존성 주입을 사용하여 더 나을 것 :

<?php 
class Contacts { 

    private $db; 

    public function setDB($conn) { 
     $this->db = $conn; 
    } 

    public function getData(){ 
     if (!$this->db) { 
      throw new Exception(); 
     } 
     $conn = $this->db; 
     $conn->Connect(...); 
     //do something 
    } 
} 
?> 

그리고 당신의 ADODB를 포함 포함 인스턴스에

+0

PHP

답변

4

왜 이렇게 간단하지 않습니까?!

클래스 외부에 연결을 설정 한 다음 이미 실행 가능한 개체를 전달하는 것이 좋습니다. 물론 그것을 필요로하는 모든 클래스에서 동일한 연결 개체를 공유해야합니다.

피씨 나는 실제로 을 회신합니다.은 ADODB를 떨어 뜨리고 PDO을 배우기 시작할 것을 권장합니다.

+0

클래스 위에 설정할 때 내 연결이 항상 열려 있지 않습니까? 나는 그 것을 정말로 좋아하지 않거나 그렇게 중요하지 않습니까? – Dnns

+1

예, 열어 둘 수 있지만 Contacts 클래스는 연결을 설정하거나 연결 세부 정보를 알 수 없습니다. 그리고 이것은 다소 오류 처리를 복잡하게 만듭니다. 그리고 그것을 사용할 다음 클래스는 어떨까요? 연결이 이미 열려 있는지 확인해야합니다. 클래스를 사용하는 순서를 변경하면 어떻게됩니까? –

+0

흠, 고마워. 내 데이터베이스 연결을 반복해서 만들지 않기 위해 ADODB를 사용하고있었습니다. 하지만 실제로 OOP를 코딩하기 위해 (hehe를 시도 할 때) 연결을 "만드는"최선의 방법을 모른다. – Dnns

2

는 전역 변수를 참조 할 필요가 초기화 섹션.

편집 : Dependency Injection에서이 기사를 참조하십시오.이 기능을 사용하는 습관을 갖게되면 (도로가 아니라) 도로 아래서 많은 골칫거리를 줄일 수 있습니다.

+1

자네가 +1했는데 팀 쿠퍼, 파블로 세보 (PabloSerbo)와 같은 컨스트럭터에 연결해야만 했어. – meouw

1

$conn은 가변 범위 밖에 있습니다. 그것이 작동되도록하려면 다음을 사용

:

class Contacts { 
    private $ref; 
    public function __construct($conn) 
    { 
     $this->ref = $conn; 
    } 
    public function getData(){ 
     $ref->Connect(...); 
     //do something 
    } 
} 

$contacts = new Contacts($conn); 
+0

나는 글로벌 변수를 만들려고했지만 잘못했다. 고마워요! – Dnns

+0

CLASS 내부에 GLOBAL var를 정의 할 수 있습니까? 그렇다면 다른 함수에서 다시 정의 할 필요가 없습니까? – Dnns

+0

global never a solutions을 사용합니다. –

4

당신은 선택할 수 있습니다

class Contacts { 
    public function getData(){ 
     global $conn; 
     $conn->Connect(...); 
     //do something 
    } 
} 

그것을 할 수있는 또 다른 방법은 개체 내부의 변수에 대한 참조를하는 것입니다 전체 예약어를 사용하십시오 :

<?php 
include_once("adodb.inc.php"); 
$conn = NewADOConnection('mysql'); 

class Contacts { 
    public function getData(){ 
     global $conn; 
     $conn->Connect(...); 
     //do something 
    } 
} 
?> 

또는 작성시 오브젝트에 $ conn을 전달하십시오.

$contacts = new Contacts($conn); 

class Contacts { 
    protected $conn; 
    public function __construct($conn){ 
     $this->conn = $conn; 
    } 
    public function getData(){ 
     $this->conn->Connect(...); 
     //do something 
    } 
} 
?> 

또는 싱글 톤 데이터 연결 개체를 사용할 수 있습니다. 하지만 그것은 안티 패턴으로 간주되므로 옵션 2에서와 같이 의존성을 주입 할 것입니다.

관련 문제