ホームページ  >  記事  >  バックエンド開発  >  XML 解析に関する質問を投稿する

XML 解析に関する質問を投稿する

WBOY
WBOYオリジナル
2016-06-13 13:24:55773ブラウズ

XML 解析に関連する質問を投稿します
$a = new SimpleXMLElement('1');
if(isset ($a[0 ] ))
{
var_dump($a);
var_dump($a[0]);
var_dump($a[1]);
}
die() ;

テストせずに、印刷されると思われる内容を判断するだけで問題ありません。 次に、

が出力されることをテストします。その理由を誰が説明できますか?

-----解決策---------
予想通り...

PHP コード

オブジェクト(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>
PHP コード

オブジェクト(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 コード

 <?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 インターフェイス (インターフェイス、またはインターフェイスに変換できるインターフェイス) を通じて、配列操作用のインターフェイスがクラスに提供されることです。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。