2011-06-12 12 views
18

¿Puede explicarnos el siguiente comportamiento interesante?Matriz de Objeto y Objeto para Matriz en PHP - comportamiento interesante

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

Vamos a convertir $testObj en una matriz.

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

Resultado:

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

OK, xprivate propiedad se convierte en testxprivate

Convirtamos esta matriz de oponerse.

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

Resultado:

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

$newObj es un objeto stdClass.

Y la pregunta es:

¿Por qué testxprivate se convierten en una propiedad privada xprivate (no testxprivate) del nuevo objeto? ¿Cómo sabe PHP que la matriz $testObj era un objeto?

Si defino la igualdad de matriz:

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

y luego convertirlo en objeto:

var_dump((object)$testArray); 

Voy a por el objeto con dos propiedades públicas y xpublictestxprivate como se esperaba:

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

Respuesta

19

La clave de matriz contiene un marcador que debe ser una propiedad privada de la prueba de clase.

comparar sus secuencias de comandos de salida con lo siguiente:

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

Cuando serializado, la misma cadena se utiliza para describir a los miembros privados.

de salida:

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

En la salida del var_dump(), los bytes nulos no son visibles.

(Actualización: miembro de clase protegida adicional)

0

Probablemente el motor de PHP conserva la estructura de clase internamente y simplemente da algún tipo de envoltorio de matriz, y por lo tanto, cuando lo vuelves a lanzar, permanece privado, aunque no puedo asegurarlo al 100%.

Cuestiones relacionadas