Neden PHP ifadesi bu tür bir çalışma olabilir?

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

Ben sözdizimi bu tür görmedim

EDIT

Bu daha büyük olasılıkla bir özellik gibi görünüyor, siz nasıl böyle bir özelliği uygulayabilirsiniz biliyor musunuz?

4 Cevap

Bu aşağıdaki gibi bir şey özelliği olan bir stdClass nesne phonenumber oluşturur ve $user->Phonenumbers diziye iter gibi görünüyor:

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

Ben de o sözdizimi görmedim.

Bamya doğru, burada bir çalışma örneği:

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

döner:

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

edit: Tamam, ben bu konuda php kılavuzunda ilgili bir şey buldum:

Bir amacı, bir nesneye dönüştürülür, bu değiştirilmez. Başka tür bir değer, bir nesneye dönüştürülür ise, stdClass yerleşik sınıf yeni bir örneği oluşturulur. Değer NULL ise, yeni örnek boş olacaktır. (source)

Yani -> sözdizimini kullanarak bir nesnenin içine thing dönüştürür. Yukarıdaki örnekte $obj böylece yeni, boş bir örneği oluşturulur null, ve foobar üye ayarlanır.

Dizi örneğe bakıldığında, arr[] ilk önce çünkü -> sözdizimi ve üye değişkeni ayarlanır boş bir nesneye dönüştürülür yeni (boş) dizi elemanı oluşturur.

php "örtük" dizi yaratır ve [] ile ve ne zaman nesneleri - tanımsız değişkenler üzerinde operatörleri>.

 $does_not_exist->foo = 1;

php bir stdclass nesnesi oluşturur ve "boş değeri varsayılan nesne oluşturma" bir "katı" uyarısı atar. Diziler ile benzer şey

 $does_not_exist[] = 1;

garip bir şekilde bazı insanlar consider bir hata olması için bir uyarı olmadan çalışır.

PHP kullanıldığı bağlam NULL typecasting olacaktır.

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

verecek

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

Sonuç olarak, yaparken:

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

Elde edilen yapı olacak

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

Ben açıklamalarda belirtildiği gibi, bunu yaparken olsa E_STRICT standartlarına karşı ve bir uyarı çıkaracağız.