note 93117 added to function.empty

From: 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

« previous php.notes (#159829) next »