2010-02-21 87 views
13
$user->Phonenumbers[]->phonenumber = '123 123'; 
$user->Phonenumbers[]->phonenumber = '456 123'; 
$user->Phonenumbers[]->phonenumber = '123 777'; 

我从来没有见过这种语法为什么这种声明可以在PHP中工作?

编辑

这似乎更可能是一个要素,你们知道我怎么能实现这样的功能?

+0

更具体吗?你看不到什么语法的部分? – 2010-02-21 17:19:51

+4

我想这是phonenumbers [] - > phonenumber部分 – Htbaa 2010-02-21 17:20:40

+1

这是否实际上不会引发错误? :o您能否提供更多的代码,特别是班级中“Phonenumbers”的定义? – poke 2010-02-21 17:24:29

回答

7

看来,像下面与物业PHONENUMBER创建stdClass的对象,并将其推入$user->Phonenumbers数组:

$user->Phonenumbers[]->phonenumber = 12345; 

我从来没有见过这种语法了。

+0

如果Phonenumbers是一个数组,那么如何使用' - >'符号呢?比较'$ foo = array(); $ foo-> test = 12345;'会导致警告。 – 2010-02-21 17:26:20

+0

哦,也许它不是一种语法,希望是一个功能,你能想出如何实现这种功能? – ORM 2010-02-21 17:27:40

+0

@Tatu Ulmanen:数组上使用'[]'。但我不知道为什么'[] - >'正在创建一个新对象。 – Gumbo 2010-02-21 17:28:20

6

浓汤是正确的,这里是一个工作示例:

<?php 
class Test 
{ 
    public $arr = array(); 
    public $obj = null; 
} 
$a = new Test(); 
$a->arr[]->foo = 1234; 
$a->arr[]->bar = 'test'; 
var_dump($a->arr); 

// even more weird on null objects 
$a->obj->foobar = 'obj was null!'; 
var_dump($a->obj); 

回报:

array(2) { 
    [0]=> 
    object(stdClass)#2 (1) { 
    ["foo"]=> 
    int(1234) 
    } 
    [1]=> 
    object(stdClass)#3 (1) { 
    ["bar"]=> 
    string(4) "test" 
    } 
} 
object(stdClass)#4 (1) { 
    ["foobar"]=> 
    string(13) "obj was null!" 
} 

编辑:好吧,我发现在PHP手册中有关这个东西:

如果一个对象被转换为一个对象,它不会被修改。如果任何其他类型的值被转换为对象,则会创建stdClass内置类的新实例。如果该值为NULL,则新实例将为空。 source

因此,使用->语法事情转换为对象。在上面的示例中$objnull,因此创建了一个新的空实例,并设置了foobar成员。

查看数组示例时,arr[]首先创建一个新的(空)数组元素,然后由于->语法而将其转换为空对象,并设置了成员变量。

+0

这太神奇了!你能解释一下原因吗? – ORM 2010-02-21 17:32:24

+0

鉴于它甚至可以与空对象一起工作(示例的第二部分),它确实有意义,用'[]'创建数组会产生这种结果。但是我不知道为什么你甚至可以访问一个不存在的对象并用它来即时创建它。 – poke 2010-02-21 17:35:35

+1

虽然会提出E_STRICT通知:*严格标准:从空值创建默认对象* – Gordon 2010-02-21 17:39:56

2

当在未定义的变量上使用[]和 - >运算符时,“隐含地”创建数组和对象。

$does_not_exist->foo = 1; 

这里php创建一个stdclass对象并抛出一个“strict”警告“从空值创建默认对象”。与阵列

$does_not_exist[] = 1; 

的类似的事情,奇怪的是没有工作的警告,有些人consider是一个错误,这错误。

1

PHP会将类型NULL转换为使用它的上下文。

var_dump((bool) NULL); 
var_dump((int) NULL); 
var_dump((float) NULL); 
var_dump((string) NULL); 
var_dump((array) NULL); 
var_dump((object) NULL); 

会给

bool(false) 
int(0) 
float(0) 
string(0) "" 
array(0) {} 
object(stdClass)#1 (0) {} 

因此,在做的时候:

$a = NULL; 
$a[] = NULL;  // used in array context `[]` 
$a[0]->foo = NULL; // object context `->` 
$a[0]->foo++;  // number context `++` 

所产生的结构将是

array(1) { 
    [0]=> 
    object(stdClass)#1 (1) { 
    ["foo"]=> 
    int(1) 
    } 
} 

就像我在评论中所提到的,这样做是反对E_STRICT标准,但会提出通知。

相关问题