课程咨询 :13623629309

太原PHP培训 > 达内新闻 > PHP 踩坑实战第二坑:empty
  • PHP 踩坑实战第二坑:empty

    发布:Hello Code      来源:Hello Code      时间:2016-11-09

  • PHP 踩坑实战第二坑:empty

    最近在同事在实践中踩到的一个 empty 坑。关于 empty 的判断类型,就不赘述了,网上解释有很多。例如:0, ”, false, null 等都会被判定为 true

    这次的坑是 empty 对于对象私有属性的判断。我们来直接上代码:

    class a

    {

    private $a1 = '123';

    public function __get($name)

    {

    return $this->$name;

    }

    }

    $a = new a();

    var_dump($a->a1,empty($a->a1));

    // string(3) "123"

    // bool(true)

    我们都知道 private 私有属性是无法在外部读取的。想要读取就需要使用 魔术方法 __get 这种场景也经常经常在各种框架中出现。

    从输出结果我们可以看出。读取是没有问题的。但是 empty 的判断却是 true。而我们再使用各种框架的时候,也经常如此直接判断,并没有该问题出现。那一定是框架背后做了一些什么。

    stackoverflow 上也有很多人对此提出了疑问,也找到了解决方案,结合框架源码,也确实如此。 那就是增加 __isset() 魔术方法。

    public function __isset($property)

    {

    return isset($this->$property);

    }

    现在返回的结果是不是跟预期一致了呢?确实是。问题解决。那为什么?

    根据 PHP 官方的解释: __isset() is triggered by calling isset() or empty() on inaccessible properties.

    和直接在 __get__isset 方法中增加输出测试。可以得出,如不增加 __isset 魔术方法(或者说如果该方法不返回 true)。那么 empty 的过程中,是不会调用 __get 进行获取数据的。没有取到数据,所以结果为 true

    PHP 的源码中 empty isset 最终调用的都是同一个方法。所以魔术方法也使用同样的 __isset

    同样的 对于私有属性进行 unset 同样需要 __unset 魔术方法。

    好了,今天就给大家讲这么多吧,喜欢我的内容可以关注或者分享(微信公众平台:tytedu)选择太原达内培训,不再孤军奋战,轻轻松松做IT高薪白领。太原达内培训带领有明确目标的学子迈向成功之路!

上一篇:内容管理框架 ThinkCMFX 2.2.1 发布,支持 PHP7

下一篇:如何组织PHP中的异常(一)

最新开班日期  |  更多

php高级开发名企定制班(剩2个名额)

php高级开发名企定制班(剩2个名额)

开班日期:12-30

php高级开发周末班(剩5个名额)

php高级开发周末班(剩5个名额)

开班日期:12-30

php高级开发免费试听(剩5个名额)

php高级开发免费试听(剩5个名额)

开班日期:12-30

更多高级开发工程师精品班

更多高级开发工程师精品班

开班日期:12-30

  • 地址:山西省太原市小店区学府街长治路高新国际A座24层
  • 课程培训电话:13623629309     全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56

    在线客服系统