2013-07-17 47 views
2

我將一個對象轉換爲數組,之後我無法通過鍵訪問得到的數組。將對象投射到數組 - 奇怪的行爲

這是代碼

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

foreach($new as $attr=>$value) 
{ 
    echo "$attr => $value \n"; 
} 

並且輸出是

EPPContact Object 
(
    [id:EPPContact:private] => 6553377C74FC9899 
    [roid:EPPContact:private] => 50085436-UK 
    [status:EPPContact:private] => ok 
    [voice:EPPContact:private] => +44.554545454 
    [email:EPPContact:private] => [email protected] 
    [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 => [email protected] 
EPPContactfax => 
EPPContactclID => TSOHOST 
EPPContactcrID => EPP-TSOHOST 
EPPContactcrDate => 2013-07-17T09:53:41 

我可以清楚地看到EPPContactemail鍵存在並保持訪問時(第3行,回波語句)雖然值它拋出未定義索引的錯誤。

你能解釋一下是什麼導致了這種行爲?

+0

如果你改變了變量名稱仍然發生? –

+0

@Tomás:它不是varname,它是鍵的類型:string!== binary_string –

+0

[相關答案](http://stackoverflow.com/questions/14547187/what-is-a-integer-property-and -whats-的含義-的-0A-0A/14547243#14547243)。 –

回答

8

當鑄造對象的數組,某些屬性(私有,保護和父屬性),具有鍵是看起來像分配給數組:

*protected 
ClassNamePrivate 
ParentNameProperty 

但他們真的是這樣的:

"\0*\0protected" 
"\0ClassName\0Private" 
"\0ParentName\0Property" 

這是什麼導致你的問題在這裏。
替換:

echo $new['EPPContactemail']; 

echo $new["\0EPPContact\0email"]; 

並把它從那裏。
請注意,您必須使用雙引號作爲字符串delemiters,因爲'\0' !== "\0",就像'\n' !== "\n"

這種行爲被記錄在php.net,though it's rather well hidden

+0

這是什麼是一個「二進制字符串」? oO – Virus721

+0

是真正需要二進制字符串的'b'嗎?你沒有處理任何設置了最重要位的字符?! _EDIT:_例如,數組訪問也是二進制安全的......所以,它是需要還是隻是讓讀者感到困惑? ;-) – bwoebi

+0

哇,太棒了,我從來沒有意識到這個怪癖。感謝您的鏈接。 –