$user->Phonenumbers[]->phonenumber = '123 123';
$user->Phonenumbers[]->phonenumber = '456 123';
$user->Phonenumbers[]->phonenumber = '123 777';
我从未见过这种语法
修改
这似乎更像是一个功能,你们知道我怎么能实现这样的功能呢?
答案 0 :(得分:7)
似乎以下内容创建了一个带有 phonenumber 属性的 stdClass 对象,并将其推送到$user->Phonenumbers
数组中:
$user->Phonenumbers[]->phonenumber = 12345;
我也从未见过这种语法。
答案 1 :(得分:6)
Gumbo是对的,这是一个有效的例子:
<?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)
因此,使用->
语法将 thing 转换为对象。在上面的示例中,$obj
是 null ,因此创建了一个新的空实例,并设置了foobar
成员。
在查看数组示例时,arr[]
首先创建一个新的(空)数组元素,然后由于->
语法而设置成员变量,然后将其转换为空对象。 / p>
答案 2 :(得分:2)
php“隐式”在使用[]和 - &gt;时创建数组和对象未定义变量的运算符。
$does_not_exist->foo = 1;
这里php创建一个stdclass对象并抛出“严格”警告“从空值创建默认对象”。与数组相似的东西
$does_not_exist[] = 1;
奇怪地在没有警告的情况下工作,有些人consider是一个错误。
答案 3 :(得分: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
标准的,并且会引起通知。