2012-08-07 60 views
0

當我們使用PDO::FETCH_CLASS時,它創建了具有公共範圍的指定類的成員變量。如何防止這種默認行爲並停止創建這些公共成員?停止生成PDO :: FETCH_CLASS不存在的成員變量

class user 
{ 
/** 
Table user has 
id int PK 
name UNIQUE 
password 
*/ 
protected $id; 
protected $name; 
/*more code.......*/ 
} 

$stmt->setFetchMode(\PDO::FETCH_CLASS, 'user'); 
$user=$stmt->fetch(); 

現在如果我var_dump() $用戶它有'密碼'公共財產。我想,以防止

+0

創建有問題的項目作爲私人成員和值不會填充,但我懷疑這不是你想要的。它也可能導致PDO拋出異常,而不是檢查。我懷疑這個答案是「你不能」,你只能忍受它。但我很樂意被證明是錯誤的。 – DaveRandom 2012-08-07 16:16:13

+0

有點相關的http://stackoverflow.com/questions/5137051/pdo-php-fetch-class其中也提到私人成員 – Cups 2012-08-07 16:19:14

+0

@Cups有趣的是,這個問題似乎表明,這個問題是問如何避免不會發生無論如何。我現在正在測試以查看它的真實含義。 – DaveRandom 2012-08-07 16:21:36

回答

0

唯一的解決辦法我能找到這一點,我會考慮接受的(我還是真的不喜歡)是將提取模式設爲PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE,並定義一個空__set()方法 - 或者至少,如果它們不存在,則不會設置這些屬性。

所以要根據您的代碼上面顯示:

class user { 

    protected $id; 
    protected $name; 

    public function __set ($name, $val) { 
    if (property_exists($this, $name)) { 
     $this->$name = $val; 
    } 
    } 

} 

$stmt->setFetchMode(\PDO::FETCH_CLASS | \PDO::FETCH_PROPS_LATE, 'user'); 
$user=$stmt->fetch(); 

這確實工作但正如我說我不喜歡,主要是在你的例子,因爲它允許protected屬性從外面設置,爲了繞過這個,你必須做出可怕的事情來創建額外的屬性來表明鎖定和所有類似的廢話。