Есть много ТАК вопросов по этому вопросу, особенно этот, но это не помогает меня.
Между property_exists
и isset
существует двусмысленность, поэтому, прежде чем задать свой вопрос, я укажу на это:
свойство_существует
property_exists проверяет, содержит ли объект свойство, не глядя на его значение. смотрит только на его видимость.
Итак, в следующем примере:
<?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
иссет
isset проверяет, существует ли значение в свойстве, учитывая, что это не так. устанавливается, если значение равно false
и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
и property_exists
в магически добавленных свойствах
Свойство может существовать со значением null
, поэтому я не могу использовать магический метод __isset
, чтобы узнать, существует свойство или нет. Я также не могу использовать property_exists
, так как свойства добавляются с помощью магических методов.
Вот пример, но это всего лишь пример, потому что в моем приложении свойства, заданные магическим образом, хранятся вне объекта.
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
Вот мой вопрос :
Есть ли волшебный метод или интерфейс SPL для реализации
property_exist
с волшебным образом добавленными свойствами?
var_dump()
, а неecho sprintf....
- person Barmar   schedule 24.05.2013printf
делает ровноecho sprintf
- person Fyfey   schedule 01.10.2015