Uso de PHP 5.3 Estoy experimentando un comportamiento extraño/no intuitivo al aplicar empty()
a las propiedades de objeto dinámico captadas a través de la función de sobrecarga __get()
. Tenga en cuenta el siguiente fragmento de código:PHP vacío() en __objeto de acceso
<?php
class Test {
protected $_data= array(
'id'=> 23,
'name'=> 'my string'
);
function __get($k) {
return $this->_data[$k];
}
}
$test= new Test();
var_dump("Accessing directly:");
var_dump($test->name);
var_dump($test->id);
var_dump(empty($test->name));
var_dump(empty($test->id));
var_dump("Accessing after variable assignment:");
$name= $test->name;
$id= $test->id;
var_dump($name);
var_dump($id);
var_dump(empty($name));
var_dump(empty($id));
?>
La salida de esta función es la siguiente. Comparación de los resultados de las empty()
cheques en el primer y segundo conjuntos de resultados:
Set # 1, resultado inesperado:
string(19) "Accessing directly:"
string(9) "my string"
int(23)
bool(true)
bool(true)
Esperando Set # 1 para volver el mismo que Set # 2:
string(36) "Accessing after variable assignment:"
string(9) "my string"
int(23)
bool(false)
bool(false)
Esto es realmente desconcertante y no intuitivo. Las propiedades del objeto imprimen cadenas no vacías pero empty()
las considera cadenas vacías. ¿Que está pasando aqui?
Parece muy extraño de hecho. Mi única opinión sobre esto es que empty(), al ser una construcción de lenguaje, de alguna manera pasa por alto la función getter. Pero eso sería un * enorme * error en mi comprensión, debe haber una mejor explicación. Interesado en ver qué surge. –
curiosamente, 'isset()' devuelve verdadero al acceder directamente. – nickf
Alan Storm lo hizo bien, hay una función de magia __isset que se llama cuando un miembro se marca con empty(). –