2012-09-20 84 views
7

當我試圖直接用索引訪問數組元素時,我感到困惑。我想我可以更好地解釋它的編碼: -爲什麼我不能直接訪問帶索引的數組?

我有Employee類的一個對象,我把它強制轉換爲數組,並試圖像這樣顯示的:

$arrOfObj = (array) $objEmployee; 

$arrKeys = array_keys($arrOfObj); 

display($arrOfObj); // display() is a method in my library that prints an array in a mannered way. 

這給了我下面的輸出: -

Array 
(
    [*m_UserId] => 1155 
    [*m_EmailPassword] => 
    [*m_IsAssignedToManagementCompany] => 
    [*m_ManagementCompanyId] => 
    [*m_DepartmentId] => 3 
    [*m_DesignationId] => 4 
    [*m_EmployeeCompletedMonth] => 
    [*m_EmployeeCompletedDay] => 
    [*m_EmailAddress] =>[email protected] 
    ------ 
    ------ 
) 

現在我在這裏我不明白這個星星(*)。當我的成員變量很簡單,如m_UserId,m_EmialPassword等等,從它得到這個Star。當我嘗試用以下2個報表顯示相同的我得到了一個錯誤: -

display($arrOfObj['*m_EmailAddress']); 

display($arrOfObj['m_EmailAddress']); 

均可以得到該錯誤消息未定義指數:m_EmailAddress

當我試圖這樣做它工作正常: -

display($arrOfObj[$arrKeys[8]]); 

最後一個工作正常,任何人都可以解釋我的問題。

  display($arrOfObj[$arrKeys[11]]); 
      display($arrOfObj['m_strEmailAddress']); 

回答

14

如果對象被轉換成一個陣列,其結果是一個數組,其元素爲對象的屬性。這些鍵是成員變量名稱,但有一些值得注意的例外:整數屬性不可訪問;私有變量的類名前加變量名; 受保護的變量在變量名前加了一個'*'。這些前置值在任一側都有空字節。

http://php.net/manual/en/language.types.array.php#language.types.array.casting

嘗試var_dump(bin2hex($arrKeys[8]))的啓示。另請參閱上述鏈接手冊中的示例。

+0

那麼我怎樣才能訪問與明星的數組保護鍵,你還沒有回答我的問題的最後3行。 – ScoRpion

+2

如果您從提取的鍵中獲得「真實」鍵值,您顯然會得到正確的鍵。要自己形成正確的密鑰,你必須包含NUL字節,如下所示:'「\ 0 * \ 0m_strEmailAddress」'。 – deceze

+6

它是'「\ 0 * \ 0strThree」'。雙引號字符串和NUL字節圍繞着星號。 – deceze

相關問題