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
ルート要素は少しつまらないです。親を持つ要素でもっと面白いです。
$root = new SimpleXMLElement('<root a="vala"><child /></root>');
$root->child[0] = 'hello';
# <root a="vala"><child>hello</child></root>
# ^^^^^- changed value
最初のchild
要素のノード値を設定します。新しい子を追加するインデックスは、次のようになります。
$root = new SimpleXMLElement('<root a="vala"><child /></root>');
$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>
と「いいえ」のオフセット:
$root->child['1'] = 'hello';
# <root a="vala"><child/><child>hello</child></root>
# ^-- added child --^
、空のブラケットを残し、最後に新しい要素を追加します。標準的な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は名前のない属性が無効であるというエラーを出力するためです。
警告::メイン():書いたりして...
別のより特別なケースが__toString
magic methodのサポートである無名の属性を作成することはできません属性は名前を持たなければならないと意味があります。オフセットとしてオブジェクトを渡すと、SimpleXMLはマジックメソッドを使って文字列に変換しようとします。上記のように返された文字列を使用します。
要約する:SimpleXMLElement
クラスはArrayAccess
インタフェースを実装していないが、それは、内部クラスであるように、それはアレイ同様の動作を追加することができます。そして、SimpleXMLはそれを正確に行います。
PHPソースのユーティリティ機能は、sxe_prop_dim_read
と呼ばれます。
しかし、あなたのクラスに似たことをしたいときはどうですか?
これは、ArrayAccess
インターフェイスのためのものです。自分のクラスで実装します。 PHPはすでに内部的に配列のようなオフセットを作るためにあなたのためにいくつかの作業をしています:integer stay integer;整数のような文字列は整数に変換され、ブール値は整数に変換されます。
ArrayAccess
は、標準配列以上のものを許容します。有効なオフセットは、浮動小数点数、NULL、配列、およびオブジェクトです。
特にNULL
の場合、オフセットNULL
の設定と新しい要素の設定には違いはありません。どちらの場合もオフセットとしてNULL
が提供されます。
インタフェースの実装例は、別の質問で利用可能です:PHP, SPL, ArrayAccess Interface。