国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - php中如何使對象可以像數組一樣進行foreach循環

php中如何使對象可以像數組一樣進行foreach循環

2020-05-15 11:14PHP教程網 PHP教程

php中如何使對象可以像數組一樣進行foreach循環呢?下面小編就詳細的為大家介紹一下吧!需要的朋友可以 過來參考下

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

跟蹤了半天以后發現了核心邏輯中的一個奇怪的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接口, 所以如果你定義了一個類,并實現了Iterator接口,那么你的這個類對象就是ZEND_ITER_OBJECT,否則就是ZEND_ITER_PLAIN_OBJECT.

 

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

而對于ZEND_ITER_OBJECT的類對象,則會通過調用對象實現的Iterator接口相關函數來進行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下運行正常。

 

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 欧美日韩一区二区三区在线观看 | 激情一区 | 特黄网站| 999精品视频一区二区三区 | 电影91久久久 | 午夜久久久久久久久久一区二区 | 在线观看三区 | 日韩精品一区二区在线观看视频 | 欧美中文字幕一区二区 | 激情欧美一区二区三区中文字幕 | 色婷婷av久久久久久久 | 黄色免费美女网站 | 国产一区视频在线看 | 日本三级网址 | 中文字幕 日韩有码 | 国产日韩精品一区二区 | 欧美日韩亚洲一区二区 | 亚洲欧美一级久久精品国产特黄 | 国产午夜一区二区三区 | 欧美成人综合视频 | 特级西西人体444www高清大胆 | 手机av在线 | 欧美一区二区在线免费观看 | 一级录像免费录像在线观看 | 九九九九国产 | 国产综合视频 | 午夜天堂精品久久久久 | 欧美二区在线 | 亚洲高清毛片一区二区 | 免费看一级电影 | 91国产精品 | 久久99国产精品久久99果冻传媒 | 91精品国产综合久久久久久漫画 | 欧美日韩亚洲一区二区 | 一区二区三区四区免费 | 后人极品翘臀美女在线播放 | 天天精品 | 国产亚洲一区二区三区在线观看 | 亚洲视频在线看 | 精品欧美一区二区三区久久久 | 国产精品一区二区久久 |