将对象转换为数组 - 奇怪的行为

Vla*_*ban 2 php arrays casting

我正在将一个对象转换为数组,之后我无法通过键访问生成的数组.

这是代码

print_r($new);
$new = (array)$new;
echo $new['EPPContactemail'];

foreach($new as $attr=>$value)
{
    echo "$attr => $value \n";
}
Run Code Online (Sandbox Code Playgroud)

输出是

EPPContact Object
(
    [id:EPPContact:private] => 6553377C74FC9899
    [roid:EPPContact:private] => 50085436-UK
    [status:EPPContact:private] => ok
    [voice:EPPContact:private] => +44.554545454
    [email:EPPContact:private] => some@email.com
    [fax:EPPContact:private] => 
    [clID:EPPContact:private] => TSOHOST
    [crID:EPPContact:private] => EPP-TSOHOST
    [crDate:EPPContact:private] => 2013-07-17T09:53:41
)

Notice: Undefined index: EPPContactemail in /home/parvhraban/domains/src/local_libs/EPP/Builder/Contact/Update.php on line 9
EPPContactid => 6553377C74FC9899
EPPContactroid => 50085436-UK
EPPContactstatus => ok
EPPContactvoice => +44.554545454
EPPContactemail => some@email.com
EPPContactfax => 
EPPContactclID => TSOHOST
EPPContactcrID => EPP-TSOHOST
EPPContactcrDate => 2013-07-17T09:53:41
Run Code Online (Sandbox Code Playgroud)

我可以清楚地看到EPPContactemail键存在并保持存取时它虽然值(线3,回波语句),它抛出未定义指数的误差.

你能解释一下导致这种行为的原因吗?

Eli*_*gem 8

将对象转换为数组时,会将某些属性(private,protected和parent属性)分配给数组,其键如下所示:

*protected
ClassNamePrivate
ParentNameProperty
Run Code Online (Sandbox Code Playgroud)

但他们看起来真的像这样:

"\0*\0protected"
"\0ClassName\0Private"
"\0ParentName\0Property"
Run Code Online (Sandbox Code Playgroud)

这就是造成你的问题的原因.
更换:

echo $new['EPPContactemail'];
Run Code Online (Sandbox Code Playgroud)

echo $new["\0EPPContact\0email"];
Run Code Online (Sandbox Code Playgroud)

从那里拿走它.
请注意,您必须使用双引号作为字符串删除器,因为'\0' !== "\0",就像'\n' !== "\n"

这种行为记录在php.net上,虽然它隐藏得很好

  • 请从这个答案中删除`b`和`(二进制)`的用法.它们是不必要的,您对其使用的解释是不正确的.简单地忽略`b`字符串前缀,`(二进制)`完全等同于`(string)`. (6认同)