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