有時為了方便和高效,我們更喜歡使用foreach … in .. 結構來遍曆資料
對於PHP強大的array在大多數情況下都能滿足我們的需要
不過,當array定義的資料結構不能滿足我們的需要時,就不得不自己來寫Iterator了
比如,PDO中提供了bindParam來動態綁定參數,具有防止注入及重複利用資源的功能
如果直接使用其提供的方法也無防,不過對於大多數項目都要有自己的資料庫操作層
在封裝這個DB操作層的時候,對於動態綁定的參數如何傳遞呢?
如果用array,則只能提供key與value,db的type等就不能提供了(使用分割符也可以,不過太過ugly)
為此,我們可以自訂以下類:
class DBParam{...} //代表一個參數class DBParams{...} //代表一組參數
其中DBParam中提供bindParam需要的參數資訊,實作類別似如下:
class DBParam{ private $_key, $_value, $_type;//如果需要可以再加上size等參數 public function __construct($key,$value,$type=PDO::PARAM_STR) { $this->_key = $key; $this->_value = $value; $this->_type = $type; } public function getKey() { return $this->_key; } public function getValue() { return $this->_value; } public function getDBType() { return $this->_type; }}
而DBParams我們是希望能夠使用foreach … in …進行遍曆的 ,因為我們會像如下代碼這樣使用它:
function fetchXXX($sql,LQP_DBParams &$params=null) { .... $stat = $this->_dbh->prepare($sql); if($params != null) { foreach($params as $p) { $stat->bindParam($p->getKey(),$p->getValue(),$p->getDBType()); } } $stat->execute(); .... }
那如何讓DBParams支援foreach呢?一般我們可以讓它繼承Iterator介面,重寫大量的方法,過於繁瑣,這裡我們直接讓其從IteratorAggregate繼承:
class DBParams implements IteratorAggregate{ private $_params = array(); public function add(LQP_DBParam $param) { array_push($this->_params, $param); } //實現的方法
public function getIterator() { return new ArrayIterator($this->_params); }}