2012-09-20 18 views
7

インデックスを使って配列要素に直接アクセスしようとしたときに混乱しました。私は、コーディングでより良いそれを説明することができると思います: -インデックスで直接配列にアクセスできないのはなぜですか?

私は従業員クラスのオブジェクトを持っていると私は配列に型キャストし、このようにそれを表示しようとした:

$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を取得するかを指定します。

m_EmailAddress:

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

または

display($arrOfObj['m_EmailAddress']); 

の両方がエラーメッセージに未定義のインデックスを与える - :私は2文を次のように同じことを表示しようとすると、私はエラーを得ましたそして、私がこのようにしてみると、うまくいく: -

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

最後の1つはうまく動作します、誰も私に問題を説明することができます。

  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

次に、私はstarで配列保護キーにアクセスできますが、私の質問の最後の3行には返信していません。 – ScoRpion

+2

抽出されたキーから「本当の」キー値を取得した場合は、明らかに正しいキーを取得します。正しい鍵を自分で作成するには、 '' \ 0 * \ 0m_strEmailAddress "'のようにNULバイトを含める必要があります。 – deceze

+6

'\ 0 * \ 0strThree" 'です。二重引用符で囲まれた文字列とNULバイトはアスタリスクのまわりにあります。 – deceze

関連する問題