ホームページ  >  記事  >  バックエンド開発  >  PHP でオブジェクトに arrays のような foreach ループを実行させる方法_PHP チュートリアル

PHP でオブジェクトに arrays のような foreach ループを実行させる方法_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 14:59:42855ブラウズ

最初にこの問題に遭遇したとき、イテレータ モードを考慮せず、いくつかの一般的なアイデアを試しましたが、失敗しました。 。 。 。私は、foreach がオブジェクトを処理するときに画期的な方法として使用できる特別な機能があるかどうかを確認するために、foreach のソース コード実装を直接調べました。

長い間追跡した結果、コアロジックに奇妙なスイッチを発見しました:

コードをコピーします コードは次のとおりです:

switch (zend_iterator_unwrap(array, &iter TSRMLS_CC)) {
ITER_INVALID:
....
ブレーク
case ZEND_ITER_PLAIN_OBJECT: {
…..



この構造から、オブジェクトが 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)) { ケース IS_OBJECT: if (Z_OBJ_HT_P( array_ptr) == &iterator_object_handlers) {
}
if (HASH _OF(array_ptr)) case IS_ARRAY:
デフォルト:
「」 ZEND_ITER_INVALID を返し、組み込みの Iterator インターフェイスがあるため、次のように定義するとクラスを作成して Iterator インターフェースを実装すると、クラス オブジェクトは ZEND_ITER_OBJECT になり、それ以外の場合は ZEND_ITER_PLAIN_OBJECT になります。
ZEND_ITER_PLAIN_OBJECT クラスの場合、foreach は HASH_OF を通じてオブジェクトのデフォルトの属性配列を取得し、その配列に対して foreach を実行します。

ZEND_ITER_OBJECT クラス オブジェクトの場合、foreach は、オブジェクトによって実装された Iterator インターフェース関連関数を呼び出すことによって実行されます。



コードをコピーします

コードは次のとおりです。 /* メソッド*/
abstract publicmixed current ( void )
abstract public scalar key ( void )
abstract public void next ( void )
abstract public void rewind ( void )
abstract public boolean valid ( void )
}


したがって、この筆記試験の問題については、次の答えを与えることができます:
コードをコピーします コードは次のとおりです:

class サンプルは Iterator を実装します
{
private $_items = array(1,2 ,3,4, 5,6,7);
パブリック関数 __construct() {
パブリック関数 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の下で。

http://www.bkjia.com/PHPjc/328120.html

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/328120.html技術記事最初にこの問題に遭遇したとき、イテレーター モードを考慮せず、いくつかの一般的なアイデアを試しましたが、失敗しました。 。 。 。 foreach が見つかることを期待して、foreach のソース コード実装を直接確認しました...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。