There is a lot of SO questions about the subject, notably this one, but it does not help me.
There is an ambiguity between property_exists
and isset
so before asking my question, I'm going to pointing it out:
property_exists
property_exists checks if an object contains a property without looking at its value, it only looks at its visibility.
So in the following example:
<?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
isset checks if a value exists in a property, considering that is is not set if a value equals false
andnull
.
<?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
and property_exists
's behaviour on magically added properties
A property can exist with a null
value, so I can't use __isset
magic method to know if a property exist or not. I also can't use property_exists
as properties are added using magic methods.
Here is a sample, but this is just a sample because in my app, properties magically set are stored outside the object.
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
So here is my question :
Is there a magic method or an SPL interface to implement
property_exist
with magically added properties ?
var_dump()
, notecho sprintf....
– Chemeshprintf
does exactlyecho sprintf
– Hungerford