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

时间:2010-02-21 17:18:14

标签: php syntax language-features

$user->Phonenumbers[]->phonenumber = '123 123';
$user->Phonenumbers[]->phonenumber = '456 123';
$user->Phonenumbers[]->phonenumber = '123 777';

我从未见过这种语法

修改

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

4 个答案:

答案 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标准的,并且会引起通知。