php面向对象的语法蹩脚,php面向对象编程的一些小问题

本文探讨了如何在PHP子类中正确使用父类的get和set方法,并揭示了`empty`函数在不同场景下的行为差异,以及为何在某些情况下会导致错误。同时,分析了子类新增属性时需要显式定义__get和__set方法的重要性。
摘要由CSDN通过智能技术生成

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方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值