发个 和 xml 解析相关的问题

CNCPT01 2012-02-13 05:25:46
$a = new SimpleXMLElement('<xml><b>1</b></xml>');
if(isset ($a[0]))
{
var_dump($a);
var_dump($a[0]);
var_dump($a[1]);
}
die();

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

谁能解释下原因?
...全文
224 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
soswxq 2012-02-16
  • 打赏
  • 举报
回复
这么复杂, 你写的?
helloyou0 2012-02-16
  • 打赏
  • 举报
回复
ok, 其实$a->xx, $a[0], 包括 $a 这些,都是我们操作一个数据结构的界面....
一个界面能得到什么结果,完全取决于我们如何写code
同样,一个数据结构提供了什么界面,也取决于我们如何写code
(当然,这有一些限制,有逻辑上的,有语言功能上的)

比如,任何一个类,只要我们实现了__toString方法,就能直接 echo $obj;
但是这不代表,这个$obj是一个字符串,只是代表我们提供了一个以字符串方式操作该数据的界面.

所以,回到你的问题,
这个SimpleXMLElement是一个资源(php的所谓资源,就是其c/c++源程序中的结构或类等),
那么提供什么样的界面,就是该扩展源程序里能控制的,
它可以提供类操作的界面"->", 也能提供数组操作界面"[0]",也能提供字符输出界面"echo"等,
也可以同时提供.那么,自然的,在提供数组操作界面时,让$x[0]返回$x本身也就不是太不能理解的事了.


我给你看的例子,就是在php层面,通过ArrayAccess这个接口(interface,可以翻译成接口,也可以翻译成界面), 给一个类提供了数组方式操作的界面.







[Quote=引用 12 楼 cncpt01 的回复:]

如果是个 resource 那么 就又涉及到了 resource[0] 是否就等于 resouece 本身?
[/Quote]
码无边 2012-02-15
  • 打赏
  • 举报
回复
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" }
CNCPT01 2012-02-15
  • 打赏
  • 举报
回复
如果是个 resource 那么 就又涉及到了 resource[0] 是否就等于 resouece 本身?
CNCPT01 2012-02-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 helloyou0 的回复:]

嗯,比较简单而不求甚解的回答是: 这个扩展就这么写的.....让$a[0]返回$a本身....

嗯,不过这个扩展到底怎么写的我也没看过它c源码...有兴趣你可以看看....

不过,这个在php层面也一样可以实现,

给你个例子,当然关键就在这个 "implements ArrayAccess"
http://www.php.net/manual/en/class.arrayac……
[/Quote]

php 手册中 有个人如下评论:


To further previous comments and drive the point home:

What makes SimpleXMLElement tricky to work with is that it feels and behaves like an object, but is actually a system RESOURCE, (specifically a libxml resource).

That's why you can't store a SimpleXMLElement to $_SESSION or perform straight comparison operations on node values without first casting them to some type of object. $_SESSION expects to store 'an object' and comparison operators expect to compare 2 'objects' and SimpleXMLElements are not objects.

When you echo or print a node's value, PHP converts the value (a resource) into a string object for you. It's a time saver for sure, but can fool you into thinking that your SimpleXMLElement is an object.

Hope this helps clarify

helloyou0 2012-02-15
  • 打赏
  • 举报
回复
嗯,比较简单而不求甚解的回答是: 这个扩展就这么写的.....让$a[0]返回$a本身....

嗯,不过这个扩展到底怎么写的我也没看过它c源码...有兴趣你可以看看....

不过,这个在php层面也一样可以实现,

给你个例子,当然关键就在这个 "implements ArrayAccess"
http://www.php.net/manual/en/class.arrayaccess.php



<?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]);






[Quote=引用 8 楼 cncpt01 的回复:]

引用 3 楼 libo_sina 的回复:

object(SimpleXMLElement)#1 (1) { ["b"]=> string(1) "1" } object(SimpleXMLElement)#2 (1) { ["b"]=> string(1) "1" }
Warning: main() [function.main]: Cannot add element xml num……
[/Quote]
helloyou0 2012-02-14
  • 打赏
  • 举报
回复
啥问题?
CNCPT01 2012-02-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 libo_sina 的回复:]

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 el……
[/Quote]

和数组的调用没有关系

是涉及到了 $a 到底是什么的问题

$a[0] 是不是数组调用?

$a[1] 是赋值操作 还是数组调用? 还是什么?

$a[0] $a[1] 是否存在 是什么值?
CNCPT01 2012-02-14
  • 打赏
  • 举报
回复
[Quote=引用楼主 cncpt01 的回复:]
$a = new SimpleXMLElement('<xml><b>1</b></xml>');
if(isset ($a[0]))
{
var_dump($a);
var_dump($a[0]);
var_dump($a[1]);
}
die();

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

谁能解释下原因?
[/Quote]为何 $a[0] 是存在的 且是 $a本身?
CNCPT01 2012-02-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 helloyou0 的回复:]

啥问题?
[/Quote]

为何 $a[0] 是存在的 且是 $a本身?
wangliwei230 2012-02-14
  • 打赏
  • 举报
回复
libo_sina 2012-02-13
  • 打赏
  • 举报
回复
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] 是数组的调用!会报错误也解释的过去;


liu510817387 2012-02-13
  • 打赏
  • 举报
回复
难道各地的测试不一样!

object(SimpleXMLElement)#1 (1) {
["b"]=>
string(1) "1"
}
object(SimpleXMLElement)#2 (1) {
["b"]=>
string(1) "1"
}
NULL
Liv2005 2012-02-13
  • 打赏
  • 举报
回复
同预想...


object(SimpleXMLElement)#1 (1) {
["b"]=>
string(1) "1"
}
object(SimpleXMLElement)#2 (1) {
["b"]=>
string(1) "1"
}
object(SimpleXMLElement)#2 (1) {
["b"]=>
string(1) "1"
}


21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧