最初にこの問題に遭遇したとき、イテレータ モードを考慮せず、いくつかの一般的なアイデアを試しましたが、失敗しました。 。 。 。私は、foreach がオブジェクトを処理するときに画期的な方法として使用できる特別な機能があるかどうかを確認するために、foreach のソース コード実装を直接調べました。
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.comtruehttp://www.bkjia.com/PHPjc/328120.html技術記事最初にこの問題に遭遇したとき、イテレーター モードを考慮せず、いくつかの一般的なアイデアを試しましたが、失敗しました。 。 。 。 foreach が見つかることを期待して、foreach のソース コード実装を直接確認しました...