php面向对象编程的一些小问题

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值