为什么我不能直接使用索引访问数组?

Sco*_*ion 7 php

当我尝试直接使用索引访问数组元素时,我感到困惑.我想我可以在编码中更好地解释它: -

我有一个Employee Class的对象和我TypeCast它到数组并尝试显示如下:

$arrOfObj = (array) $objEmployee;

$arrKeys = array_keys( $arrOfObj );

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

这给了我以下输出: -

Array
(
   [*m_UserId] => 1155
   [*m_EmailPassword] => 
   [*m_IsAssignedToManagementCompany] => 
   [*m_ManagementCompanyId] => 
   [*m_DepartmentId] => 3
   [*m_DesignationId] => 4
   [*m_EmployeeCompletedMonth] => 
   [*m_EmployeeCompletedDay] => 
   [*m_EmailAddress] =>showket.mca@gmail.com
   ------
   ------
 )
Run Code Online (Sandbox Code Playgroud)

现在我在这里不明白这个星(*).当我的成员变量很简单时,如m_UserId,m_EmialPassword等等,从中得到这个星.当我尝试用以下2个语句显示相同时我得到一个错误: -

display( $arrOfObj['*m_EmailAddress'] );
Run Code Online (Sandbox Code Playgroud)

要么

display( $arrOfObj['m_EmailAddress'] );
Run Code Online (Sandbox Code Playgroud)

两者都给出错误消息未定义索引:m_EmailAddress

当我尝试这样做它工作正常: -

display( $arrOfObj[$arrKeys[8]] );
Run Code Online (Sandbox Code Playgroud)

最后一个工作正常,任何人都可以解释我的问题.

            display( $arrOfObj[$arrKeys[11]] );
            display( $arrOfObj['m_strEmailAddress'] );
Run Code Online (Sandbox Code Playgroud)

dec*_*eze 15

如果将对象转换为数组,则结果是一个数组,其元素是对象的属性.键是成员变量名,有一些值得注意的例外:整数属性是不可访问的; 私有变量的类名前置于变量名; 受保护的变量在变量名前面加上'*'.这些前置值在任一侧都有空字节.

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

尝试var_dump(bin2hex($arrKeys[8]))启蒙.另请参阅上面链接手册中的示例.

  • 这是`"\ 0*\0strThree"`.双引号字符串和NUL字节在星号周围. (6认同)
  • 如果从提取的密钥中获得"真实"密钥值,您显然会得到正确的密钥.要自己形成正确的密钥,必须包含NUL字节,如下所示:`"\ 0*\0m_strEmailAddress"`. (2认同)