XML 解析に関連する質問を投稿します
$a = new SimpleXMLElement('
if(isset ($a[0 ] ))
{
var_dump($a);
var_dump($a[0]);
var_dump($a[1]);
}
die() ;
テストせずに、印刷されると思われる内容を判断するだけで問題ありません。 次に、
が出力されることをテストします。その理由を誰が説明できますか?
-----解決策---------
予想通り...
オブジェクト(SimpleXMLElement)#1 (1) { ["b"]=> 文字列(1) "1" } オブジェクト(SimpleXMLElement)#2 (1) { ["b"]=> 文字列(1) "1" } オブジェクト(SimpleXMLElement)#2 (1) { ["b"]=> 文字列(1) "1" } <br><font color="#e78608">------解決策------------------</font><br> 場所によってテストは異なりますか? <br>
オブジェクト(SimpleXMLElement)#1 (1) { ["b"]=> 文字列(1) "1" } オブジェクト(SimpleXMLElement)#2 (1) { ["b"]=> 文字列(1) "1" } NULL <br><font color="#e78608">------解決策------------------</font><br> オブジェクト(SimpleXMLElement)#1 (1) { ["b"]=> 文字列(1) "1" } オブジェクト(SimpleXMLElement)#2 (1) { ["b"]=> 文字列(1) "1" " } <br>警告: main() [function.main]: D:APMServ5.2.6wwwhtdocslocalhostsimple_xml.php の 7 行目にそのような要素が 0 個しか存在しない場合、要素 xml 番号 1 を追加できません<br>object(SimpleXMLElement)#2 ( 1) { ["b"]=> 文字列(1) "1" } <br>---------------------------- --- -<br>var_dump($a); この型がオブジェクトの場合は問題ありません! <br><br>a[0] または a[1] が配列呼び出しである場合は、エラーが報告されます。説明しました;<br> <br><br> <br><font color="#e78608">------解決策------------------</font><br> 何が問題ですか? <br><font color="#e78608">------解決策------------------</font><br> <br><font color="#e78608">------解決策------------------</font><br> さて、答えは比較的単純で、多くの説明は必要ありません: この拡張機能は次のように書かれています... $a[0] が $a 自体を返すようにします...<br><br>うーん、でもどうなのでしょうかこの拡張機能は C ソースコードも見たことがありません...興味があれば見てみてください...<br><br>ただし、これは PHP レベルでも実現できます。<br><br>もちろん例を示します。鍵はこの「ArrayAccess の実装」にあります<br>http://www.php.net/manual/en/class.arrayaccess.php<br><br><br>
<?php クラス X は ArrayAccess {を実装します パブリック $a=1; パブリック関数 offsetExists ( $offset ){ if($offset==0) true を返します。 } パブリック関数 offsetGet ( $offset ){ if($offset==0)$this を返す; } パブリック関数 offsetSet ( $offset , $value ){ if($offset==0) $this->a=$value; } パブリック関数 offsetUnset ( $offset ){ if($offset==0) unset($this->a); } } $m=新しいX(); print_R($m); print_R($m[0]); <br /><font color='#e78608'>------解決策------------------</font><br /> <dl class='code'>PHP コード<pre class="brush:php;toolbar:false"> オブジェクト(SimpleXMLElement)#1 (1) { ["b"]=> 文字列(1) "1" } オブジェクト(SimpleXMLElement)#2 (1) { ["b"]=> 文字列(1) "1" " } 警告: main() [function.main]: 7 行目の PHPDocument1 にそのような要素が 0 個しか存在しない場合、要素 xml 番号 1 を追加できません object(SimpleXMLElement)#2 (1) { ["b"]=> string(1) "1" } <br><font color="#e78608">------解決策------------------</font><br> 実際、$a を含む $a->xx、$a[0] はすべて、データ構造を操作するためのインターフェイスです。<br>インターフェイスからどのような結果が得られるかは、完全に依存します。コードの書き方<br>同様に、データ構造が提供するインターフェイスもコードの書き方に依存します<br>(もちろん、これには論理関数と言語関数の両方でいくつかの制限があります)<br><br>たとえば、 __toString メソッドを実装している限り、どのクラスでも $obj を直接エコーできます。<br> ただし、これは $obj が文字列であることを意味するのではなく、文字列インターフェイスでデータを操作するメソッドを提供することを意味します。 .<br><br>それでは、質問に戻ります。<br>この SimpleXMLElement はリソース (PHP のいわゆるリソースは、C/C++ ソース プログラム内の構造体またはクラスなどです)、<br>拡張ソースプログラムではどのようなインターフェイスを制御できますか? <br> クラス操作インターフェイス「->」、配列操作インターフェイス「[0]」、文字出力インターフェイス「echo」を提供できます。など、同時に <br> を提供することもできます。したがって、配列操作インターフェイスを提供する場合、$x[0] が <br><br> ここで示す例は、PHP レベルで、ArrayAccess インターフェイス (インターフェイス、またはインターフェイスに変換できるインターフェイス) を通じて、配列操作用のインターフェイスがクラスに提供されることです。