PHP および PHP 拡張機能は、Zend Engine の上に構築されています。Zend Engine の機能をユーザーランド (PHP スクリプト) に公開し、ユーザーランドまたは他の PHP 拡張機能に公開される独自の機能を追加します。
Zend Engine は、オブジェクト ディメンション ( によって公開される機能) にアクセスする方法と、オブジェクトArrayAccess
を反復するために使用される一般的な反復メカニズム ( の同上Iterator
) を備えたオブジェクト モデルを提供します。このオブジェクト モデルは、PHP と任意の拡張機能がオブジェクトのタイプ ( zend オブジェクト ハンドラー) を置き換えることができる多数のハンドラーで構成されています。オブジェクト モデル上で、Zend エンジンは標準タイプのオブジェクト (「zend オブジェクト」) を実装します。各オブジェクトはzend_object
データ構造と各クラスに従います (これは、構造によって、それを取得する方法を提供する以外に、低レベルのオブジェクト インターフェイスが認識しない概念ですzend_class_entry
)。
ArrayAccess
実際には SPL インターフェースではありません。Zend Engine 自体で定義されています。read_dimension
// write_dimension
zendオブジェクトのhas_dimension
低レベル ハンドラーは、オブジェクトがそのようなインターフェイスを実装しているかどうかをチェックし、実装されている場合はそれぞれのメソッドを呼び出すような方法で実装されます (こちらを参照)。
Iterator
また、SPL インターフェイスではありません。Zend Engine でも定義されています。この場合、このインターフェースのサポートは少し高いレベルで行われます。低レベルのオブジェクト ハンドラは、オブジェクトの繰り返しについて何も知りません。これは Zend オブジェクトのプロパティです。この構造体には、フィールドとフィールドzend_class_entry
という 2 つの関連メンバーがあります。これらは、反復子の操作と状態、および新しい反復子の作成方法を定義します。特に、クラスがランタイムに登録されると、そのインターフェイスが実装されているかどうかがチェックされ、実装されている場合は、iterator_funcs
get_iterator
Iterator
zend_class_entry
そのクラスの変数は、ネイティブ反復インターフェースを PHP メソッドにブリッジするネイティブ メソッドに設定されます。PHP 拡張機能を作成する場合、ネイティブ イテレーター (反復メソッドをネイティブに実装する) を作成するか、ユーザー ランドと同様に、Iterator
PHP メソッド (この場合はネイティブ PHP メソッド) を実装して作成するかを選択できます。インターフェイスが説明するように、いくつかの操作。
このCountable
インターフェースは、実際に SPL インターフェースである唯一のものです。Zend Engine はそれについて何も知りません。その機能は、count
関数の実装がその存在をチェックしcount
、インターフェイスが存在する場合はメソッドを呼び出すという事実から派生しています。
オペレーター拡張機能は、より低レベルの設定で動作します。実行時に、Zend Engine のメモリに直接書き込み、PHP コードがコンパイルされるオペコードのハンドラーを置き換えます (そのため、たとえば、ZEND_ASSIGN_ADD
新しいネイティブ実装があり、ユーザーが選択できる PHP 関数/メソッドに委ねられます)。