2009-03-19 19 views
1

あなたは属性にアクセスするには、この要素の上に角括弧を使用することができます奇妙な何Simple XMLは[]演算子をどのように使用しますか? PHPで

$node = /* SimpleXMLElement */ 
$id = $node['id']; 

$idが文字列ではないということです、それは別のSimpleXMLElementです。なぜそれは文字列ではありませんか?私は自分自身がこの場所にstrval()を使っているのを見つけます。

角括弧はどのように機能していますか?私は自分の授業でそれをすることはできますか?私はこれについてのドキュメントで何も見たことがない。

答えて

3

PHP標準ライブラリの一部であるArrayAccess interfaceを実装することで、オブジェクトにArrayのようなアクセスを提供できます。このインタフェースは、「完全なPHP標準ライブラリエクステンションがインストールされていなくても、このインタフェースをPHP 5でも利用可能です」というものの1つです。あなたがインスタンス化されたオブジェクトに角括弧を使用することができるはず

public boolean offsetExists (string $offset ) 
public mixed offsetGet (string $offset) 
public void offsetSet (string $offset , string $value) 
public void offsetUnset (string $offset) 

をこのインタフェースを実装し、あなたのクラスのための4つのメソッドを定義することにより

SimpleXML自体については、実際にArrayAccessインターフェイスを実装しているかどうか、あるいはPHPソースの背後で何か他のことが起こっているかどうかはわかりません。

0

私はそれが魔法の方法__get()

編集だと思う:私は私が間違って推測だと思います。まだアレイアクセスインターフェースを知らなかった。

1

SimpleXMLクラスを拡張し、その中にArrayAccessを実装することができます。

1

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

関連する問題