Verifique se existe uma propriedade nas propriedades definidas magicamente
Há muitas perguntas sobre o assunto, especialmenteeste, mas isso não me ajuda.
Existe uma ambiguidade entreproperty_exists
eisset
então, antes de fazer a minha pergunta, vou apontar:
property_exists verifica se um objeto contém uma propriedade sem olhar para o seu valor, apenas olha para o seuvisibilidade.
Então, no exemplo a seguir:
<?php
class testA
{
private $a = null;
}
class testB extends testA
{
}
$test = new testA();
echo var_dump(property_exists($test, 'a')); // true
// parent's private property becomes invisible for its child
$test = new testB();
echo var_dump(property_exists($test, 'a')); // false
issetisset verifica se existe um valor em uma propriedade, considerando que não está definido se um valor é igual afalse
e null
.
<?php
$var = null;
echo var_dump(isset($var)); // false
$var = '';
echo var_dump(isset($var)); // true
$var = false;
echo var_dump(isset($var)); // true
$var = 0;
echo var_dump(isset($var)); // true
$var = '0';
echo var_dump(isset($var)); // true
isset
eproperty_exists
o comportamento em propriedades adicionadas magicamenteUma propriedade pode existir com umnull
valor, então eu não posso usar__isset
método mágico para saber se uma propriedade existe ou não. Eu também não posso usarproperty_exists
as propriedades são adicionadas usando métodos mágicos.
Aqui está uma amostra, mas isso é apenas uma amostra porque no meu aplicativo,propriedades magicamente definidas são armazenadas fora do objeto.
class test {
private $data = array();
public function __get($key) {
echo "get $key\n";
return array_key_exists($key, $data) ? $data[$key] : null;
}
public function __set($key, $value) {
echo "set $key = $value\n";
$this->data[$key] = $value;
}
public function __isset($key) {
echo sprintf("isset $key ( returns %b )", isset($this->data[$key]));
return isset($this->data[$key]);
}
}
$test = new test();
$test->x = 42;
isset($test->x); // 1
$test->y = null;
isset($test->y); // 0
property_exists($test, 'y'); // 0
Então aqui está a minha pergunta :
Existe um método mágico ou uma interface SPL para implementarproperty_exist
com propriedades adicionadas magicamente?