为什么这种语句可以在PHP中运行?

ORM*_*ORM 13 php syntax language-features

$user->Phonenumbers[]->phonenumber = '123 123';
$user->Phonenumbers[]->phonenumber = '456 123';
$user->Phonenumbers[]->phonenumber = '123 777';
Run Code Online (Sandbox Code Playgroud)

我从未见过这种语法

编辑

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

Gum*_*mbo 7

似乎以下内容创建了一个带有属性phonenumberstdClass对象并将其推送到数组中:$user->Phonenumbers

$user->Phonenumbers[]->phonenumber = 12345;
Run Code Online (Sandbox Code Playgroud)

我也从未见过这种语法.


pok*_*oke 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 );
Run Code Online (Sandbox Code Playgroud)

收益:

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!"
}
Run Code Online (Sandbox Code Playgroud)

编辑:好的,我在php手册中找到了与此相关的内容:

如果将对象转换为对象,则不会对其进行修改.如果将任何其他类型的值转换为对象,则会创建stdClass内置类的新实例.如果值为NULL,则新实例将为空.(来源)

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

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