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

Tôi chưa từng thấy loại cú phápTại sao loại tuyên bố này có thể hoạt động trong PHP?

EDIT

này dường như có lẽ nhiều tính năng, làm các bạn biết làm thế nào tôi có thể thực hiện một tính năng như thế này?

+0

Mọi thứ cụ thể hơn? Bạn đã thấy phần nào của cú pháp? –

+4

Tôi đoán nó là Phonenumbers [] -> phonenumber phần – Htbaa

+1

Điều này thực sự không ném một lỗi? : o Bạn có thể cung cấp thêm một chút về mã, đặc biệt là định nghĩa của 'Phonenumbers' trong lớp? – poke

Trả lời

7

Dường như một cái gì đó như sau tạo ra một stdClass đối tượng với thuộc tính phonenumber và đẩy nó vào mảng $user->Phonenumbers:

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

Tôi chưa từng thấy cú pháp đó quá.

+0

Nếu Phonenumbers là một mảng, làm thế nào bạn có thể sử dụng ký hiệu '->' trên đó? So sánh với '$ foo = array(); $ foo-> test = 12345; 'dẫn đến cảnh báo. –

+0

Ồ, có thể đó không phải là cú pháp, hy vọng một tính năng, bạn có thể tìm ra cách triển khai loại tính năng này không? – ORM

+0

@Tatu Ulmanen: '[]' được sử dụng trên mảng. Nhưng tôi không biết tại sao '[] ->' lại tạo ra một đối tượng mới. – Gumbo

6

Gumbo là đúng, đây là một ví dụ làm việc:

<?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); 

lợi nhuận:

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!" 
} 

chỉnh sửa: Được rồi, tôi tìm thấy một cái gì đó liên quan trong cuốn hướng dẫn php về điều này:

Nếu một đối tượng được chuyển đổi thành một đối tượng, nó sẽ không được sửa đổi. Nếu một giá trị của bất kỳ loại nào khác được chuyển đổi thành một đối tượng, thì một cá thể mới của lớp dựng sẵn stdClass được tạo ra. Nếu giá trị là NULL, cá thể mới sẽ trống. (source)

Vì vậy, sử dụng cú pháp -> chuyển đổi điều vào một đối tượng. Trong ví dụ trên $objnull, do đó, một phiên bản trống mới, trống được tạo và thành viên foobar được đặt.

Khi xem ví dụ mảng, arr[] trước tiên tạo thành phần mảng mới (trống), sau đó được chuyển đổi thành đối tượng trống vì cú pháp -> và biến thành viên được đặt.

+0

Điều này thật tuyệt vời! Bạn có thể giải thích tại sao không? – ORM

+0

Cho rằng nó thậm chí làm việc với các đối tượng null (phần thứ hai của ví dụ), nó có ý nghĩa, rằng việc tạo mảng với các kết quả '[]' trong này. Nhưng tôi không biết tại sao bạn thậm chí có thể truy cập một đối tượng không tồn tại và tạo ra nó một cách nhanh chóng với điều đó. – poke

+1

Sẽ nâng cao thông báo E_STRICT mặc dù: * Tiêu chuẩn nghiêm ngặt: Tạo đối tượng mặc định từ giá trị trống * – Gordon

2

php "ngầm" tạo mảng và đối tượng khi sử dụng toán tử [] và -> trên biến không xác định.

$does_not_exist->foo = 1; 

tại đây php tạo đối tượng stdclass và ném cảnh báo "nghiêm ngặt" "Tạo đối tượng mặc định từ giá trị trống". Điều tương tự với mảng

$does_not_exist[] = 1; 

hoạt động kỳ quặc mà không có cảnh báo, một số người consider là lỗi.

1

PHP sẽ nhập NULL vào ngữ cảnh mà nó được sử dụng.

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

sẽ cho

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

Do đó, khi thực hiện:

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

cấu trúc kết quả sẽ là

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

Giống như tôi đã đề cập trong các ý kiến, làm như vậy là chống lại E_STRICT tiêu chuẩn mặc dù và sẽ nâng cao một thông báo.

Các vấn đề liên quan