SimpleXML 自体は内部クラスです。PHP ユーザー空間用に実装する唯一のインターフェースはTraversable
.
角括弧を使用して内部的にアクセスすると、SimpleXML はインデックス/キーの値とタイプに応じて物事を探します。
型が整数 (long) の場合、インデックスがゼロで番号が付けられた要素を見つけて、その値を提供しようとします。$root
ルート要素のような具体的なノード要素が$root[0]
ある場合、その要素の値を表します:
$root = new SimpleXMLElement('<root a="vala"></root>');
$root[0] = 'hello';
# <root a="vala">hello</root>
# ^^^^^- changed value
ルート要素は 1 つしか存在しないため、少し面白くありません。親を持つ要素を使用すると、より興味深いものになります。
$root = new SimpleXMLElement('<root a="vala"><child /></root>');
$root->child[0] = 'hello';
# <root a="vala"><child>hello</child></root>
# ^^^^^- changed value
child
最初の要素のノード値を設定します。インデックスを 1 つ上にすると、新しい子が追加されます。
$root = new SimpleXMLElement('<root a="vala"><child /></root>');
$root->child[1] = 'hello';
# <root a="vala"><child/><child>hello</child></root>
# ^-- added child --^
これは、配列とほとんど同じように機能します。整数である文字列は、整数のように機能します。
$root->child['1'] = 'hello';
# <root a="vala"><child/><child>hello</child></root>
# ^-- added child --^
括弧を空のままにすると、最後に新しい要素が追加されます。
$root->child[] = 'hello';
$root->child[] = 'world';
# <root a="vala"><child/><child>hello</child><child>world</child></root>
これまでのところ、整数と「いいえ」のオフセットについてです。標準の PHP 配列と同様に、これを渡すことと混同しないでくださいNULL
。空の文字列に変換されます""
。
どんな文字列でも、SimpleXML は子要素ノードではなく属性ノードを探します。
$root = new SimpleXMLElement('<root a="vala"></root>');
echo $root['a'], "\n"; # vala
これは、属性を追加する場合にも機能します。
$root = new SimpleXMLElement('<root a="vala"></root>');
$root['b'] = 'hello'; # <root a="vala" b="hello"/>
エッジケースは、空の文字列 ( ""
)を使用NULL
しているか、名前のない属性が無効であると言って simplexml でエラーが発生したためです。属性には名前が必要なので、理にかなっています。
警告: main(): 名前のない属性を書き込んだり、作成したりできません ...
もう 1 つの特殊なケースは、__toString
マジック メソッドのサポートです。オブジェクトをオフセットとして渡すと、SimpleXML はマジック メソッドを使用してオブジェクトを文字列に変換しようとします。次に、返された文字列を上記のように使用します。
要約すると、SimpleXMLElement
クラスはインターフェイスを実装していませんArrayAccess
が、内部クラスであるため、配列と同様の動作を追加できます。SimpleXML はまさにそれを行います。
PHP ソースのユーティリティ関数は と呼ばれsxe_prop_dim_read
ます。
しかし、クラスで同様のことをしたい場合はどうでしょうか?
そのためのArrayAccess
インターフェースです。独自のクラスに実装します。PHP は、オフセットをより配列のようにするために、すでに内部でいくつかの作業を行っています。整数のような文字列は整数に変換され、ブール値は整数に変換されます。
ただしArrayAccess
、標準の配列以上のものを使用できます。有効なオフセットは、float、NULL、配列、およびオブジェクトです。
特に ではNULL
、オフセットの設定と新しい要素の設定を区別することはできません。NULL
どちらの場合もNULL
オフセットとして提供されます。
インターフェースの実装例は、別の質問で利用できます: PHP, SPL, ArrayAccess Interface .