最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

php中如何使對象可以像數(shù)組一樣進行foreach循環(huán)

 更新時間:2013年08月09日 09:44:30   作者:  
php中如何使對象可以像數(shù)組一樣進行foreach循環(huán)呢?下面小編就詳細的為大家介紹一下吧!需要的朋友可以 過來參考下

剛接觸到題的時候,我也沒有考慮到Iterator模式,試了幾個一般想法,失敗以后。。。。就直接去翻看了foreach的源碼實現(xiàn),期望發(fā)現(xiàn)foreach處理對象的時候是否有什么特殊性,可以做為突破口。

跟蹤了半天以后發(fā)現(xiàn)了核心邏輯中的一個奇怪的switch:

復制代碼 代碼如下:

switch (zend_iterator_unwrap(array, &iter TSRMLS_CC)) {
        default:
        case ZEND_ITER_INVALID:
               .....
               break
        case ZEND_ITER_PLAIN_OBJECT: {
                ......
            break;
     case ZEND_ITER_PLAIN_ARRAY:
            .....
            break;
        case ZEND_ITER_OBJECT:
            ......
            break;
}

從這個結構,我們可以看到,對象分為ZEND_ITER_OBJECT和ZEND_ITER_PLAIN_OBJECT, 這是什么意思呢?
復制代碼 代碼如下:

ZEND_API enum zend_object_iterator_kind zend_iterator_unwrap(
    zval *array_ptr, zend_object_iterator **iter TSRMLS_DC)
{
    switch (Z_TYPE_P(array_ptr)) {
        case IS_OBJECT:
            if (Z_OBJ_HT_P(array_ptr) == &iterator_object_handlers) {
                *iter = (zend_object_iterator *)zend_object_store_get_object(array_ptr TSRMLS_CC);
                return ZEND_ITER_OBJECT;
            }
            if (HASH_OF(array_ptr)) {
                return ZEND_ITER_PLAIN_OBJECT;
            }
            return ZEND_ITER_INVALID;
        case IS_ARRAY:
            if (HASH_OF(array_ptr)) {
                return ZEND_ITER_PLAIN_ARRAY;
            }
            return ZEND_ITER_INVALID;
        default:
            return ZEND_ITER_INVALID;
    }
}

這就要講到PHP的內置接口Iterator了,PHP5開始支持了接口, 并且內置了Iterator接口, 所以如果你定義了一個類,并實現(xiàn)了Iterator接口,那么你的這個類對象就是ZEND_ITER_OBJECT,否則就是ZEND_ITER_PLAIN_OBJECT.

對于ZEND_ITER_PLAIN_OBJECT的類,foreach會通過HASH_OF獲取該對象的默認屬性數(shù)組,然后對該數(shù)組進行foreach.

而對于ZEND_ITER_OBJECT的類對象,則會通過調用對象實現(xiàn)的Iterator接口相關函數(shù)來進行foreach,iterator接口:

復制代碼 代碼如下:

Iterator extends Traversable {
/* 方法 */
abstract public mixed current ( void )
abstract public scalar key ( void )
abstract public void next ( void )
abstract public void rewind ( void )
abstract public boolean valid ( void )
}

所以, 對于這道筆試題, 可以作出如下的答案:
復制代碼 代碼如下:

class sample implements Iterator
{
    private $_items = array(1,2,3,4,5,6,7);
    public function __construct() {
                  ;//void
    }
    public function rewind() { reset($this->_items); }
    public function current() { return current($this->_items); }
    public function key() { return key($this->_items); }
    public function next() { return next($this->_items); }
    public function valid() { return ( $this->current() !== false ); }
}
$sa = new sample();
foreach($sa as $key => $val){
    print $key . "=>" .$val;
}

以上代碼在我的php 5.3下運行正常。

相關文章

  • 如何解決CI框架的Disallowed Key Characters錯誤提示

    如何解決CI框架的Disallowed Key Characters錯誤提示

    本篇文章是對解決CodeIgniter框架應用中,出現(xiàn)Disallowed Key Characters錯誤提示的方法,進行了詳細的分析介紹,需要的朋友可以參考下
    2013-07-07
  • PHP互換兩個變量值的方法(不用第三變量)

    PHP互換兩個變量值的方法(不用第三變量)

    相信每個剛接觸PHP語言的童鞋們應該藕知道,PHP中兩個變量的值互換是個很常見的做法,那么下面這篇文章我們就來介紹幾個對于變量值互換的常見操作方法,文中介紹的很詳細,相信對于大家的理解和學習很有幫助,下面有需要的朋友們來一起看看吧。
    2016-11-11
  • 9段PHP實用功能的代碼推薦

    9段PHP實用功能的代碼推薦

    本文是記錄一下小編常用的幾段實用的代碼,做項目的時候經常會用到,這里推薦給大家,大家可以隨意擴展
    2014-10-10
  • mysql總結之explain

    mysql總結之explain

    最近看了一些explain方面的資料,但是感覺網上的都差不多,基本也和manual差不多,所以自己總結了些,有些不明白的已經用黃色底色標出,希望各位拍磚
    2012-02-02
  • thinkphp中多表查詢中防止數(shù)據(jù)重復的sql語句(必看)

    thinkphp中多表查詢中防止數(shù)據(jù)重復的sql語句(必看)

    下面小編就為大家?guī)硪黄猼hinkphp中多表查詢中防止數(shù)據(jù)重復的sql語句(必看)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • php面向對象編程self和static的區(qū)別

    php面向對象編程self和static的區(qū)別

    這篇文章主要介紹了PHP中static關鍵字以及與self關鍵字的區(qū)別,本文講解了static關鍵字的定義、遲綁定(Late Static Bindings)、以及與self關鍵字的區(qū)別等內容,需要的朋友可以參考下
    2016-05-05
  • php讀取XML的常見方法實例總結

    php讀取XML的常見方法實例總結

    這篇文章主要介紹了php讀取XML的常見方法,結合實例形式總結了php基于DOMDocument、simplexml、正則及xmlreader讀取xml文件的相關操作技巧,需要的朋友可以參考下
    2017-04-04
  • PHP十六進制顏色隨機生成器功能示例

    PHP十六進制顏色隨機生成器功能示例

    這篇文章主要介紹了PHP十六進制顏色隨機生成器功能,結合具體實例形式分析了php隨機生成十六進制數(shù)值表示形式的相關操作技巧,需要的朋友可以參考下
    2017-07-07
  • PHP+APACHE實現(xiàn)網址偽靜態(tài)

    PHP+APACHE實現(xiàn)網址偽靜態(tài)

    這篇文章主要介紹了PHP+APACHE通過使用mod rewrite模塊實現(xiàn)網址偽靜態(tài)的相關資料,需要的朋友可以參考下
    2015-02-02
  • 靜態(tài)html文件執(zhí)行php語句的方法(推薦)

    靜態(tài)html文件執(zhí)行php語句的方法(推薦)

    下面小編就為大家?guī)硪黄o態(tài)html文件執(zhí)行php語句的方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11

最新評論

涟源市| 江门市| 桃园市| 陇川县| 文登市| 辽源市| 子洲县| 庆安县| 常德市| 文化| 奉新县| 西充县| 赞皇县| 娄烦县| 积石山| 顺平县| 呼和浩特市| 洛扎县| 太谷县| 三穗县| 莱州市| 永泰县| 四子王旗| 宣化县| 扶绥县| 梁平县| 新邵县| 大埔区| 芦溪县| 简阳市| 靖西县| 泽库县| 沾化县| 三原县| 于都县| 嘉黎县| 友谊县| 南充市| 正定县| 海阳市| 六枝特区|