note 93117 added to function.empty
| From: | Janci at osu1 dot php dot net | Date: | Mon, 24 Aug 2009 15:57:24 +0000 |
| Subject: | note 93117 added to function.empty | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-159829@lists.php.net to get a copy of this message | ||
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.
----
Server IP: 64.71.164.2
Probable Submitter: 83.244.184.222
----
Manual Page -- http://www.php.net/manual/en/function.empty.php
Edit -- https://master.php.net/note/edit/93117
Del: integrated -- https://master.php.net/note/delete/93117/integrated
Del: useless -- https://master.php.net/note/delete/93117/useless
Del: bad code -- https://master.php.net/note/delete/93117/bad+code
Del: spam -- https://master.php.net/note/delete/93117/spam
Del: non-english -- https://master.php.net/note/delete/93117/non-english
Del: in docs -- https://master.php.net/note/delete/93117/in+docs
Del: other reasons-- https://master.php.net/note/delete/93117
Reject -- https://master.php.net/note/reject/93117
Search -- https://master.php.net/manage/user-notes.php