Voting

: three plus five?
(Example: nine)

The Note You're Voting On

Janci
15 years ago
Please note that results of empty() when called on non-existing / non-public variables of a class are a bit confusing if using magic method __get (as previously mentioned by nahpeps at gmx dot de). Consider this example:

<?php
class Registry
{
protected
$_items = array();
public function
__set($key, $value)
{
$this->_items[$key] = $value;
}
public function
__get($key)
{
if (isset(
$this->_items[$key])) {
return
$this->_items[$key];
} else {
return
null;
}
}
}

$registry = new Registry();
$registry->empty = '';
$registry->notEmpty = 'not empty';

var_dump(empty($registry->notExisting)); // true, so far so good
var_dump(empty($registry->empty)); // true, so far so good
var_dump(empty($registry->notEmpty)); // true, .. say what?
$tmp = $registry->notEmpty;
var_dump(empty($tmp)); // false as expected
?>

The result for empty($registry->notEmpty) is a bit unexpeced as the value is obviously set and non-empty. This is due to the fact that the empty() function uses __isset() magic functin in these cases. Although it's noted in the documentation above, I think it's worth mentioning in more detail as the behaviour is not straightforward. In order to achieve desired (expexted?) results, you need to add __isset() magic function to your class:

<?php
class Registry
{
protected
$_items = array();
public function
__set($key, $value)
{
$this->_items[$key] = $value;
}
public function
__get($key)
{
if (isset(
$this->_items[$key])) {
return
$this->_items[$key];
} else {
return
null;
}
}
public function
__isset($key)
{
if (isset(
$this->_items[$key])) {
return (
false === empty($this->_items[$key]));
} else {
return
null;
}
}
}

$registry = new Registry();
$registry->empty = '';
$registry->notEmpty = 'not empty';

var_dump(empty($registry->notExisting)); // true, so far so good
var_dump(empty($registry->empty)); // true, so far so good
var_dump(empty($registry->notEmpty)); // false, finally!
?>

It actually seems that empty() is returning negation of the __isset() magic function result, hence the negation of the empty() result in the __isset() function above.

<< Back to user notes page

To Top