2012-01-17 3 views
9

매직 메소드를 사용하여 속성을 저장하는 클래스가 있습니다. 이 (작동하지 않습니다)처럼이 실행 된 것 후 나는 PDOStatement의 각 데이터베이스 행에 대해이 클래스의 객체를 인스턴스화하기 위해 노력하고있어매직 메소드로 PDO :: FETCH_CLASS 사용하기

class Foo { 
    protected $props; 

    public function __construct(array $props = array()) { 
     $this->props = $props; 
    } 

    public function __get($prop) { 
     return $this->props[$prop]; 
    } 

    public function __set($prop, $val) { 
     $this->props[$prop] = $val; 
    } 
} 

: 여기에 간단한 예입니다

$st->setFetchMode(PDO::FETCH_CLASS, 'Foo'); 

foreach ($st as $row) { 
    var_dump($row); 
} 

문제는 PDO::FETCH_CLASS이 속성 값을 설정할 때 내 클래스의 마법 __set() 메서드를 트리거하지 않는 것입니다.

어떻게하면 PDO를 사용하여 원하는 효과를 얻을 수 있습니까?

+1

가능한 복제본 [PHP PDO : 객체로 데이터를 가져 오는 중 - BEFORE __construct가 지정된 속성이 호출되었습니다. 이게 맞습니까?] (http://stackoverflow.com/questions/2862279/php-pdo-fetching-data-as-objects-properties-assigned-before-construct-is-ca) – outis

답변

12

PDO의 기본 동작은 생성자를 호출하기 전에 속성을 설정하는 것입니다. 생성자를 호출 한 후 속성을 설정하기 위해 가져 오기 모드를 설정할 때 PDO::FETCH_PROPS_LATE을 비트 마스크에 포함하면 정의되지 않은 속성에서 __set 마법 메서드가 호출됩니다.

$st->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'Foo'); 

다르게는, 인스턴스를 생성하고 그것으로 페치 (즉 PDO::FETCH_INTO에 페치 모드 설정).

+1

고맙습니다. 호기심에서 생성자를 호출하기 전에 설정하는 것이 성능상의 이점입니까? 'PDO :: FETCH_PROPS_LATE'가 기본 동작이 아닌 이유를 이해할 수 없습니다 ... – FtDRbwLXw6

+0

@drrcknlsn : "왜?" 거기에는 다른 질문이 있습니다. 주석은 설명을위한 요청 이외의 추가 질문을위한 것이 아닙니다. – outis

+1

붙여 넣은 링크를 읽었지만 왜 이것이 기본 동작인지에 대한 대답이 없습니다. 나는이 질문에 IMO에 새로운 질문을하기에 충분하지 않기 때문에이 질문을하고 있지만 여전히 알고 싶다. – FtDRbwLXw6