首页  >  文章  >  后端开发  >  发个 和 xml 解析相关的有关问题

发个 和 xml 解析相关的有关问题

WBOY
WBOY原创
2016-06-13 13:24:55771浏览

发个 和 xml 解析相关的问题
$a = new SimpleXMLElement('1');
if(isset ($a[0]))
{
  var_dump($a);
  var_dump($a[0]);
  var_dump($a[1]);
}
die();

大家不测试 直接判断下 认为会打印出什么。 然后再测试下打印出什么

谁能解释下原因?

------解决方案--------------------
同预想...

PHP code

object(SimpleXMLElement)#1 (1) {
  ["b"]=>
  string(1) "1"
}
object(SimpleXMLElement)#2 (1) {
  ["b"]=>
  string(1) "1"
}
object(SimpleXMLElement)#2 (1) {
  ["b"]=>
  string(1) "1"
}
<br><font color="#e78608">------解决方案--------------------</font><br>
难道各地的测试不一样!<br>
PHP code

object(SimpleXMLElement)#1 (1) {
  ["b"]=>
  string(1) "1"
}
object(SimpleXMLElement)#2 (1) {
  ["b"]=>
  string(1) "1"
}
NULL
<br><font color="#e78608">------解决方案--------------------</font><br>
object(SimpleXMLElement)#1 (1) { ["b"]=> string(1) "1" } object(SimpleXMLElement)#2 (1) { ["b"]=> string(1) "1" } <br>Warning: main() [function.main]: Cannot add element xml number 1 when only 0 such elements exist in D:\APMServ5.2.6\www\htdocs\localhost\simple_xml.php on line 7<br>object(SimpleXMLElement)#2 (1) { ["b"]=> string(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>给你个例子,当然关键就在这个 "implements ArrayAccess"<br>http://www.php.net/manual/en/class.arrayaccess.php<br><br><br>
PHP code

 <?php class X implements ArrayAccess  {
     public $a=1;
     
     public function offsetExists ( $offset ){
         if($offset==0)return true;
     }
     public function offsetGet ( $offset ){
         if($offset==0)return $this;
     }
     
     public function offsetSet ( $offset , $value ){
         if($offset==0) $this->a=$value;
     }
     public function  offsetUnset (  $offset ){
         if($offset==0) unset($this->a);
     }
     
 }

 $m=new X();
 
 print_R($m);
 print_R($m[0]);
<br><font color="#e78608">------解决方案--------------------</font><br>
PHP code
object(SimpleXMLElement)#1 (1) { ["b"]=> string(1) "1" } object(SimpleXMLElement)#2 (1) { ["b"]=> string(1) "1" } 
Warning: main() [function.main]: Cannot add element xml number 1 when only 0 such elements exist in PHPDocument1 on line 7
object(SimpleXMLElement)#2 (1) { ["b"]=> string(1) "1" }
<br><font color="#e78608">------解决方案--------------------</font><br>
ok, 其实$a->xx, $a[0], 包括 $a 这些,都是我们操作一个数据结构的界面....<br>一个界面能得到什么结果,完全取决于我们如何写code<br>同样,一个数据结构提供了什么界面,也取决于我们如何写code  <br>(当然,这有一些限制,有逻辑上的,有语言功能上的)<br><br>比如,任何一个类,只要我们实现了__toString方法,就能直接 echo $obj;  <br>但是这不代表,这个$obj是一个字符串,只是代表我们提供了一个以字符串方式操作该数据的界面.<br><br>所以,回到你的问题,<br>这个SimpleXMLElement是一个资源(php的所谓资源,就是其c/c++源程序中的结构或类等),<br>那么提供什么样的界面,就是该扩展源程序里能控制的,<br>它可以提供类操作的界面"->", 也能提供数组操作界面"[0]",也能提供字符输出界面"echo"等,<br>也可以同时提供.那么,自然的,在提供数组操作界面时,让$x[0]返回$x本身也就不是太不能理解的事了.<br><br><br>我给你看的例子,就是在php层面,通过ArrayAccess这个接口(interface,可以翻译成接口,也可以翻译成界面), 给一个类提供了数组方式操作的界面. 
                 
              
              
        
            
声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn