go 有没有类似php isset这样的函数_PHP7中的isset
升级 php7 后 isset 不太对了
公司升级 php7 后出现了一个问题
类似这样 isset($post->user->name) 始终为 false
之前的 php 5.6 就很正常
laravel 版本是 5.1.35(很久没升级了)
先看看 isset
isset 用来检测变量是否设置
首先我们来看官方的一个例子
大致上是下面这个意思
上面这个例子将永远返回 false,因为 foo 并不是 Post 的属性,而是 __get 取出来的
魔术方法 __isset
那么怎么解决上面那个问题呢?使用魔术方法
类似 Eloquent 的例子
看着 laravel 5.1.35 的代码,我们自己写一个简单的例子
先有一个 Model,简单的实现。__get,__set,__isset
然后我们定义一个 Post Moel 和一个 User Moel
好了来验证一下 isset
答案
分析上面的结果,感觉像是 php 7 isset 方法对对象的判断有了变化,如果先执行一次,$post->user->name,也就是将 user 放在 post 的 relations 中,这样 isset ($post->user) 为 true,随后 isset ($post->user->name) 才为 true。
最后在 Eloquent model 的 git log 中 找到了答案,
<blockquote> PHP 7 has fixed a bug with __isset which affects both thenative isset and empty methods. This causes specific issues
with checking isset or empty on relations in Eloquent. In
PHP 7 checking if a property exists on an unloaded relation,
for example isset($this->relation->id) is always
returning false because unlike PHP 5.6, PHP 7 is now
checking the offset of each attribute before chaining to
the next one. In PHP 5.6 it would eager load the relation
without checking the offset. This change brings back the
intended behavior of the core Eloquent model __isset method
for PHP 7 so it works like it did in PHP 5.6.
For reference, please check the following link,
specifically Nikita Popov's comment (core PHP dev) - https:// bugs.php.net/bug.php? id=69659 </blockquote>
大致上是 php7 isset 判断的时候,会依次判断。php5.6 则会预加载关系。其实 laravel 也早在 5 月份就做了相关的处理,所以升级 laravel 后,自然也就没有这个问题了。
更多学习内容请访问:
八重樱:腾讯T3-T4标准精品PHP架构师教程目录大全,只要你看完保证薪资上升一个台阶(持续更新)zhuanlan.zhihu.com以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的可以加入我的官方群点击此处。
您可能感兴趣的文章:
go 有没有类似php isset这样的函数_PHP7中的isset
关于php函数isset和empty的一些误解
PHP 什么是语言构造器 什么是可变函数
php isset()和unset()函数用法浅析
PHP isset与empty使用举例
PHP判断变量是否已存在
php数组判断键值是否存在示例
php empty(),isset()与is_null()的用法区别分析
empty()和isset()函数的区别
php中empty和isset用法的区别是什么?