1、 empty检查对象属性是否为空
有这样一个类:
class CyTest {
private $val;
function __construct($_val=''){
$this->val = $_val;
}
function __get($name){
return $this->$name;
}
function getV(){
return $this->val;
}
}
$obj = new CyTest('aaaa');
var_dump(empty($obj->val)); // true
$val = $obj->getV();
var_dump(empty($val)); // false
echo "get/n";
从这里可以看出,empty($obj->val)显示$obj->val为空,而$obj->getV()显示它又不为空。猜测是由于第一种方式没有调用__get方法。修改__get方法如下:
function __get($name){
echo "get/n";
return $this->$name;
}
证实了猜测,没有get输出,该方法没被调用。
但是为什么呢?
还有,如果我们把这两句合为一句:
$val = $obj->getV();
var_dump(empty($val));
----->
var_dump(empty($obj->getV()));
则报错:
Fatal error: Can't use method return value in write context
那么,猜测,这个错误,和上面不同的结果,都是由于empty的原因。
2、子类新增的属性,不能直接用父类的set和get方法
class CBase{
private $val;
function __construct($_val){
$this->val = $_val;
}
function __set($name, $val){
$this->$name = $val;
}
function __get($name){
return $this->$name;
}
}
class CChild extends CBase{
private $cval;
function __construct($_val, $_cval){
$this->cval = $_cval;
parent::__construct($_val);
}
}
$child = new CChild('val', 'cval');
var_dump($child->val);
var_dump($child->cval);
这里,必须在子类也显示声明__get和__set方法。