5

、 、などIterator、SPL から PHP の一般的に使用されるインターフェイスについて読んでいます。しかし、私はそれらがどのように機能するかを正確に理解していません。CountableArrayAccess

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

また、下位レベルの言語と同じ方法で他の演算子をオーバーロードする機能を提供する Operator 拡張機能についても読みました。Operator 拡張機能は明らかに PHP コアを変更するためArrayAccess、舞台裏で同じように動作するのではないかと考えていました。

私はいじくり屋なので、中身を知らずに何かを使うのは難しいと思います。

4

1 に答える 1

11

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_dimensionzendオブジェクトのhas_dimension低レベル ハンドラーは、オブジェクトがそのようなインターフェイスを実装しているかどうかをチェックし、実装されている場合はそれぞれのメソッドを呼び出すような方法で実装されます (こちらを参照)。

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

このCountableインターフェースは、実際に SPL インターフェースである唯一のものです。Zend Engine はそれについて何も知りません。その機能は、count関数の実装がその存在をチェックしcount、インターフェイスが存在する場合はメソッドを呼び出すという事実から派生しています。

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

于 2011-01-01T23:12:31.353 に答える