PHP Iterator的使用

來源:互聯網
上載者:User

有時為了方便和高效,我們更喜歡使用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); }}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.