2013-03-08 39 views
4

越来越对象变量的时候,我只是想了解为什么最后两个print_r()调用下面不工作,并引发以下错误Undefined property: stdClass::$0问题。根据PHP文档,我应该能够访问使用下面的操作$object->{'x'}对象数值属性(x是数字索引我要访问)。PHP - 阵列反对 - 由指数

谢谢。

$array = (object)array( 
    0 => 'test1', 
    1 => 'test2', 
    2 => 'test3', 
    'test' => (object)array(
     0 => 'hi1', 
     1 => 'hi2', 
     2 => 'hi3' 
    ) 
); 

print_r($array); 

print_r($array->test); 

print_r($array->test->{'0'}); 

print_r($array->{'0'}); 

die(); 
+0

值得一提的是,变量或属性名称不能以数字开头,所以stdClass :: $ 0无论如何都不会有效 – 2013-03-08 22:10:27

+0

您能否提供一个指向PHP文档的部分的链接,告诉您这会起作用? – Barmar 2013-03-08 22:13:07

+0

有趣。它使用花括号表示来设置:'$ array - > {0} ='test1';的print_r($阵列 - > {0});' – MichaelRushton 2013-03-08 22:19:02

回答

3

这是PHP brokenness。对象属性访问的大括号语法不适用于全数字密钥

-2

这是工作:

$array = (object)array( 
    a => 'test1', 
    b => 'test2', 
    c => 'test3', 
    'test' => (object)array(
     a => 'hi1', 
     b => 'hi2', 
     c => 'hi3' 
    ) 
); 

print_r($array); 

print_r($array->test); 

print_r($array->test->a); 

print_r($array->b); 

die(); 
+1

_ “PHP致命错误:无法使用类型stdClass的的对象作为阵列” _ – Wrikken 2013-03-08 22:10:25

+0

我编辑了我的代码,再试一次 – 2013-03-08 22:22:06

+0

你编辑了你的代码,直到你完全错过了这个问题的要点。 。整数密钥是问题(并且您有依赖于常数一些草率代码'A','B'和'C'不是要定义'限定(“A”,0);定义(“B”,0 ); define('c',0);',并看看你的代码做什么.... – Wrikken 2013-03-08 22:34:36

1

当类型转换的阵列的一个对象,全数字键被转换成整数性能;并且整数属性不能被访问。

$array = array(0 => 'a', 1.5 => 'b', '2' => 'c'); 

var_dump((object) $array); 

// object(stdClass)#1 (3) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" } 

然而,使用大括号时设置它们被存储为字符串全数字性能;其中可以访问

$array = (object) array(); 

$array->{0} = 'a'; 

$array->{1.5} = 'b'; 

$array->{'2'} = 'c'; 

var_dump($array); 

// object(stdClass)#1 (3) { ["0"]=> string(1) "a" ["1.5"]=> string(1) "b" ["2"]=> string(1) "c" } 

因此你遇到的问题。