2011-01-01 10 views
5

私は、Iterator,Countable、およびArrayAccessのように、SPLから一般的に使用されるPHPのインターフェイスについて読んできました。しかし、私は彼らの働き方を正確に理解していません。ArrayAccessはどのように機能しますか?

[]配列演算子のオーバーロードなど、その実装がPHPのコア機能を変更していますか?

オペレータ拡張機能についても読んでいます。これは、低レベル言語と同じ方法で他の演算子に過負荷をかけることができます。オペレータエクステンションがPHPコアを明確に変更しているので、私はArrayAccessが背後で同じように動作するかどうか疑問に思っていましたか?

私は変態者です。その結果、何がフードの下にあるのかを知らずに何かを使用することは困難です。

+0

これはあなたの質問に答えません。しかし、あなたは内部について尋ねているので、ここで終わります:http://svn.php.net/repository/php/php-src/branches/PHP_5_3/Zend/ - あなたはzend_interfacesを見ているかもしれません。 cと../ext/spl/になりました。 – mario

答えて

10

PHPとPHPの拡張機能は、Zend Engineの上に構築されています。 Zend Engineの機能をユーザランド(PHPスクリプト)に公開し、独自の機能を追加します。これらの機能は、ユーザの土地や他のPHP拡張機能に公開されています。

Zend Engineは、オブジェクトの次元(ArrayAccessによって公開された機能)とオブジェクトにアクセスするための一般的な反復メカニズム(Iteratorのidem)にアクセスする方法を提供します。このオブジェクトモデルは、PHPおよび任意の拡張がオブジェクトのタイプ(zend object handlers)を置き換えることができるいくつかのハンドラで構成されています。オブジェクトモデル上で、Zendエンジンは標準タイプのオブジェクト(「zendオブジェクト」)を実装します。各オブジェクトはzend_objectのデータ構造を持ち、各クラスは低レベルのオブジェクトインタフェースがそれを取得する方法を提供すること以外には知らないという概念であり、zend_class_entry構造体によって構成されています。

ArrayAccessは実際にはSPLインターフェイスではありません。これはZend Engine自体で定義されています。 read_dimension/write_dimension/has_dimension低レベルハンドラのzendオブジェクトは、オブジェクトがそのようなインタフェースを実装しているかどうかをチェックし、その場合はそれぞれのメソッドを呼び出すように実装されています(here参照)。

IteratorもSPLインターフェイスではありません。これはZend Engineでも定義されています。この場合、このインタフェースのサポートはやや高いレベルで行われます。低レベルのオブジェクトハンドラはオブジェクトの反復を何も知らない。これはZend Objectsのプロパティです。 zend_class_entry構造体には、iterator_funcsフィールドとget_iteratorフィールドの2つの関連するメンバーがあります。これらは、イテレーターの操作と状態、および新しいイテレーターの作成方法を定義します。特にIteratorの場合、クラスがランタイムに登録されると、そのインターフェイスを実装しているかどうかがチェックされ、そうであれば、そのクラスのzend_class_entry変数の関連フィールドがネイティブ反復インタフェースをPHPに橋渡しするネイティブメソッドに設定されますメソッド。 PHP拡張モジュールを書く場合はネイティブイテレータ(ネイティブイテレータを実装)を書くか、ユーザランドと同じようにIteratorを実装し、PHPメソッド(この場合はネイティブPHPメソッド)を書くことができますインタフェースのようないくつかの操作が説明します。

Countableインターフェイスは、実際にはSPLインターフェイスです。 Zend Engineはそれについて何も知らない。その機能は、count functionの実装がその存在をチェックし、インタフェースが存在する場合にはcountメソッドを呼び出すという事実に由来します。

オペレータ拡張機能は、より低レベルの設定で動作します。実行時に、Zend Engineのメモリに直接書き込んで、コンパイルされたopcodeのハンドラを置き換えます(例えば、ZEND_ASSIGN_ADDには、ユーザが選択できるいくつかのPHP関数/メソッドに代わる新しいネイティブ実装があります) 。

+0

うわあ、ありがとうございました** Artefacto **その包括的な対応については、確かに私の理解のギャップに満ちていました。私は間違いなく多くのことを学ぶ必要があります。 – Dan

関連する問題