发个 和 xml 解析相关的问题
$a = new simplexmlelement('1');
if(isset ($a[0]))
{
var_dump($a);
var_dump($a[0]);
var_dump($a[1]);
}
die();
大家不测试 直接判断下 认为会打印出什么。 然后再测试下打印出什么
谁能解释下原因?
------解决方案--------------------
同预想...
php codeobject(simplexmlelement)#1 (1) { [b]=> string(1) 1}object(simplexmlelement)#2 (1) { [b]=> string(1) 1}object(simplexmlelement)#2 (1) { [b]=> string(1) 1}
------解决方案--------------------
难道各地的测试不一样!
php codeobject(simplexmlelement)#1 (1) { [b]=> string(1) 1}object(simplexmlelement)#2 (1) { [b]=> string(1) 1}null
------解决方案--------------------
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 d:\apmserv5.2.6\www\htdocs\localhost\simple_xml.php on line 7
object(simplexmlelement)#2 (1) { [b]=> string(1) 1 }
-----------------------------
var_dump($a);这个类型是对象是没问题的!
a[0] 或 a[1] 是数组的调用!会报错误也解释的过去;
------解决方案--------------------
啥问题?
------解决方案--------------------
------解决方案--------------------
嗯,比较简单而不求甚解的回答是: 这个扩展就这么写的.....让$a[0]返回$a本身....
嗯,不过这个扩展到底怎么写的我也没看过它c源码...有兴趣你可以看看....
不过,这个在php层面也一样可以实现,
给你个例子,当然关键就在这个 implements arrayaccess
http://www.php.net/manual/en/class.arrayaccess.php
php code a=$value; } public function offsetunset ( $offset ){ if($offset==0) unset($this->a); } } $m=new x(); print_r($m); print_r($m[0]);
------解决方案--------------------
php codeobject(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 7object(simplexmlelement)#2 (1) { [b]=> string(1) 1 }
------解决方案--------------------
ok, 其实$a->xx, $a[0], 包括 $a 这些,都是我们操作一个数据结构的界面....
一个界面能得到什么结果,完全取决于我们如何写code
同样,一个数据结构提供了什么界面,也取决于我们如何写code
(当然,这有一些限制,有逻辑上的,有语言功能上的)
比如,任何一个类,只要我们实现了__tostring方法,就能直接 echo $obj;
但是这不代表,这个$obj是一个字符串,只是代表我们提供了一个以字符串方式操作该数据的界面.
所以,回到你的问题,
这个simplexmlelement是一个资源(php的所谓资源,就是其c/c++源程序中的结构或类等),
那么提供什么样的界面,就是该扩展源程序里能控制的,
它可以提供类操作的界面->, 也能提供数组操作界面[0],也能提供字符输出界面echo等,
也可以同时提供.那么,自然的,在提供数组操作界面时,让$x[0]返回$x本身也就不是太不能理解的事了.
我给你看的例子,就是在php层面,通过arrayaccess这个接口(interface,可以翻译成接口,也可以翻译成界面), 给一个类提供了数组方式操作的界面.