oop - PHP empty() on __get accessor -
using php 5.3 i'm experiencing weird / non-intuitive behavior when applying empty() dynamic object properties fetched via __get() overload function. consider following code snippet:
<?php class test { protected $_data= array( 'id'=> 23, 'name'=> 'my string' ); function __get($k) { return $this->_data[$k]; } } $test= new test(); var_dump("accessing directly:"); var_dump($test->name); var_dump($test->id); var_dump(empty($test->name)); var_dump(empty($test->id)); var_dump("accessing after variable assignment:"); $name= $test->name; $id= $test->id; var_dump($name); var_dump($id); var_dump(empty($name)); var_dump(empty($id)); ?> the output of function follow. compare results of empty() checks on first , second result sets:
set #1, unexpected result:
string(19) "accessing directly:" string(9) "my string" int(23) bool(true) bool(true) expecting set #1 return same set #2:
string(36) "accessing after variable assignment:" string(9) "my string" int(23) bool(false) bool(false) this baffling , non-intuitive. object properties output non-empty strings empty() considers them empty strings. what's going on here?
based on reading of empty's manual page , comments (ctrl-f isset and/or double underscores), looks known behavior, , if want __set , __get methods , empty play nice together, there's implicit assumption implement __isset magic method well.
it little bit unintuitive , confusing, tends happen meta-programming, particularly in system php.
Comments
Post a Comment