2011-06-12 16 views
18

sonraki ilginç davranışlarını açıklayabilir misiniz?Dizisi - ilginç davranış

class test { 
    //Class *test* has two properties, public and private. 
    public $xpublic = 'x1'; 
    private $xprivate = 'x2'; 
} 
$testObj = new test(); 

Diziyi $testObj dönüştürelım.

settype($testObj, 'array'); 
var_dump($testObj); 

Sonuç:

array(2) { 
    ["xpublic"]=> string(3) "x1" 
    ["testxprivate"]=> string(4) "x2" 
}

Tamam, xprivate mülkiyet

testxprivate en bu dizi nesne dönüştürelim olur.

$newObj = (object)$testObj; 
var_dump($newObj); 

Sonuç:

object(stdClass)#1 (2) { 
    ["xpublic"]=> string(3) "xxx" 
    ["xprivate":"test":private]=> string(4) "xxx3" 
}

$newObj bir stdClass amacıdır.

Ve soru:

Neden yeni nesnenin bir özel mülkiyet xprivate (değil testxprivate) olmak testxprivate gelir? PHP, $testObj dizisinin bir nesne olduğunu nasıl biliyor?

Eşit dizi tanımlarsanız: o zaman

$testArray = array('xpublic'=>'x1', 'testxprivate'=>'x2'); 

ve dönüştürmek buna itiraz etmek: beklendiği gibi

var_dump((object)$testArray); 

İki kamu özellikleri xpublic ve testxprivate nesneyi elde edersiniz:

object(stdClass)#2 (2) { 
    ["xpublic"]=> string(2) "x1" 
    ["testxprivate"]=> string(2) "x2" 
}

cevap

19

dizi anahtarı bu sınıf testi özel bir özelliği olması gereken bir işaretleyici içerir.

aşağıdaki ile komut çıkışını karşılaştırın:

$array = array(
    "xpublic" => "x1", 
    # this will become a private member: 
    "\x00test\x00xprivate" => "x2", 
    # this will become a protected member: 
    "\x00*\x00xprotected" => "x3" 
); 

var_dump($array); 

$obj = (object) $array; 

var_dump($obj); 

tefrika, aynı dize özel üyelerini tanımlamak için kullanılır.

Çıkış: var_dump() çıktısında

 
array(3) { 
    ["xpublic"]=> 
    string(2) "x1" 
    ["testxprivate"]=> 
    string(2) "x2" 
    ["*xprotected"]=> 
    string(2) "x3" 
} 

object(stdClass)#1 (3) { 
    ["xpublic"]=> 
    string(2) "x1" 
    ["xprivate":"test":private]=> 
    string(2) "x2" 
    ["xprotected":protected]=> 
    string(2) "x3" 
} 

, boş bayt görünür değildir.

(Güncelleme: Eklenen korumalı sınıf üyesi)

0

Muhtemelen PHP motoru olarak internal ve basitçe sınıf yapısını koruyan bir dizi sarıcı çeşit verir ve bunu döküm zaman% 100 bu garanti edemez olsa böylece yine, özel kalır.