2014-02-25 79 views
0

我想創建一個類的獲取方法;這裏是一個(可能是過度)簡化例如:

<?php 
class User { 
    protected $name; 
    public function fetch($id) { 
     global $db; 
     $sql = "SELECT [name] FROM [user] WHERE [id] = :id"; 
     $ins = array ('id' => $id); 
     $stmt = $db->prepare($sql); 
     $stmt->setFetchMode(PDO::FETCH_INTO, $this); 
     $stmt->execute($ins); 
     $stmt->fetch(); 
    } 
} 

現在,這將是可愛的,如果這個工作,但是,當然,它不作爲$name是受保護的財產,因此我得到的錯誤。

Cannot access protected property User::$name yadda yadda.... 

所以,我花了,而在網上淘,試圖找到一種替代方法,雖然我已經發現了一些建議,這可以工作,我希望有人也許能夠推薦的方法。顯然我不想公開用戶的屬性或使用魔術設置器。

+0

如果獲取成功,您可以使用'stdClass'並將其中的公共屬性複製到受保護的屬性中? – halfer

+3

檢查這個答案:http://stackoverflow.com/a/3296207/612202 –

+0

我已經實現了該答案的建議。雖然我不知道;感覺有點過度! – user1187347

回答

-1

您沒有在代碼示例中的任何位置使用$ name或$ this-> name,所以我假設您正在嘗試從對象外部設置$ name屬性。

所以,當你實例,你只需用一個參數做了類爲什麼不能在傳遞價值的構造方法

<?php 
class User { 
    protected $name; 

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

    public function fetch($id) { 
     global $db; 
     $sql = "SELECT [name] FROM [user] WHERE [id] = :id"; 
     $ins = array ('id' => $id); 
     $stmt = $db->prepare($sql); 
     $stmt->setFetchMode(PDO::FETCH_INTO, $this); 
     $stmt->execute($ins); 
     $stmt->fetch(); 
    } 
} 

然後。

$cUser = new User('Fred'); 

增加了一些澄清後:

PDO :: FETCH_INTO:更新請求的類的現有實例,映射結果集到類命名屬性的列。

因此,您必須在運行setFetchMode()和fetch()(其中屬性名稱與查詢結果中某些或全部行匹配)之前必須具有現有的實例化對象以將數據放入。

<?php 
class User { 
    protected $row; 

    public function fetch($id) { 
     global $db; 

     $sql = "SELECT * FROM user WHERE id = :id"; 
     $ins = array ('id' => $id); 
     $stmt = $db->prepare($sql); 
     $stmt->execute($ins); 

     // Create a class 
     $this->row = new stdClass(); 

     // Now creates the properties you are interested in 
     $this->row->name = ''; 
     $this->row->dob = ''; 
     $this->row->email = ''; 

     $stmt->setFetchMode(PDO::FETCH_INTO, $this->row); 
     $stmt->fetch(); 

     print_r($this->row); 
    } 

} 
?> 

我希望這是一個更多的幫助。

+0

不,你的假設是不正確的。我的問題是如何去使用PDO的FETCH_INTO $這與私人/受保護的屬性類 – user1187347

+0

我已經修改我的答案,現在我明白了這個問題 – RiggsFolly

相關問題