2010-02-21 83 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標準,但會提出通知。

相關問題