2016-08-25 35 views
0

我被一個非常奇怪的bug卡住了。我有一個對象叫做$行,看起來像這樣:PHP允許在stdObject中有重複的屬性嗎?

stdClass Object 
(
    [title] => Some Title 
    [body] => My body 
    [topic] => Topic 
    [dataType] => Survey 
    [csvrownum] => 1 
) 

我只是想打印出來的title屬性以下列方式:

print_r($row->title); 

但是由於某些原因不輸出什麼。

然後我試圖手動設置標題屬性,並在之後打印出來,這樣的事情:

$row->title = 'My Title'; 
print_r($row->title); 

令人驚訝的是工作,但爲什麼呢?爲了使這更奇怪,我決定的var_dump對象手動設置標題變量之後:

$row->title = 'My Title'; 
var_dump($row); 

這就是我的了:

class stdClass#391 (6) { 
    public $title => 
    string(3) "Some title" 
    public $body => 
    string(7) "My body" 
    public $topic => 
    string(6) "Topic" 
    public $dataType => 
    string(17) "Survey" 
    public $csvrownum => 
    int(1) 
    public $title => 
    string(8) "My title" 
} 

公告標題密鑰複製與不同值。這有可能發生嗎?

+1

您的其他'標題'中有不可打印的字符 – tkausl

+1

我認爲@tkausl是正確的。注意var轉儲中第一個標題的長度是3,而不是8.可能是編碼問題。 –

回答

4

不,PHP不允許對象具有重複的屬性名稱,因爲PHP中的對象與數組一樣實現。它們都是按照有序的hashmaps來實現的。在散列圖中,兩個具有相同散列的事物相互覆蓋。

您的對象屬性名稱中可能只有不可打印的字符。你可以做這樣的事情進行調試以下更清楚地看到這...

foreach($row as $key => $value) { 
    var_dump($key); 
} 

如果我們有這樣的一個對象,例如,你會看到它被覆蓋。

$row = new stdClass; 
$row->title = "First"; 
$row->title = "Second"; 

但是這樣的事情可能會更具有欺騙性......從對重點用var_dumpforeach

$row = new stdClass; 
$row->{"title\0"} = "First"; 
$row->title = "Second"; 

輸出,將揭示這個...

 
string(6) "title" 
string(5) "title" 

一個公告是長度爲6string,另一個是長度爲5的字符串。

鹽糧

它總是最好使用var_dump當試圖調試變量比使用類似print_r,爲var_dump是專門爲調試目的而設計的,而print_r只是一個遞歸打印(故名 )。打印值如null,false或空字符串,不會爲調試目的提供有用的信息,但var_dump可以。

+0

你救了我的一天。我正在使用一個名爲migrate的drupal模塊自動解析csv。 CSV使用utf-8 BOM編碼,因此我無法訪問第一個字段。每打印一次,我看到標題欄有8個字符的長度,而第二個標題欄只有5個。 – Topicus