PHP 7.2 中 count 更加严格了

分享 liyu001989 ⋅ 于 7个月前 ⋅ 最后回复由 will_lin 2个月前 ⋅ 10879 阅读

先贴代码
file

在PHP7.2中,如果参数不是数组,或者没有实现 Countable 接口,就会报错了。

在这个rfc中有提到,https://wiki.php.net/rfc/counting_non_countables

所以用到 count 的地方,需要注意一下了
比如下面这段代码

$user = User::find(1);
if (count($user)) {
    do something
}

其实可以这样,

$user = User::find(1);
if ($user) {
    do something
}

本文章首发在 Laravel China 社区

liyu001989
Laravel 教程 - 实战构架 API 服务器
Laravel 教程 - 微信小程序从零到发布

本帖已被设为精华帖!
本帖由 Summer 于 7个月前 加精
回复数量: 19
  • ElfSundae
    7个月前

    Laravel framework 老版本也有这个问题,数据库部分。如果线上有 L5.3 或更早的项目,千万别升级 PHP 7.2

  • 悲剧不上演 一个拍黄片的开发仔 1
    7个月前
    $users = User::where('status',1)->get();
    dd($users->count());    //我一般通过这个判断
  • young Code is Poetry 1
    7个月前

    可以用 collection 的 isNotEmpty() 方法代替

  • nff93
    7个月前

    @young 然而User::find返回的并不是Collection
    楼主用count来判断单个Eloquent也是奇怪的写法。。。

  • liyu001989 MOD
    7个月前

    @young @nff93 你们不要纠结例子,我只是看到了类似代码,说明一下而已

  • JiangDev
    7个月前 ⋅ via iOS 客户端

    我都這樣
    if ($user = User::find($id)) {
    }

  • mingyun
    6个月前
    $user = User::all();
    if ($user) {
        //如果为空也成立的
    }
  • JiangDev
    6个月前 ⋅ via iOS 客户端

    真的假的空也成立
    印象中沒有
    我再試試

  • liyu001989 MOD 1
    6个月前

    eloquent find 如果没找到会返回null 所以可以

    $user = User::find(1);
    if ($user) {
        // do something
    }

    $user = User::all(); 或者 $user = User::where($params)->get(); 返回的是 Collection 对象,当然不能用 if 判断对象了

    $user = User::all(); 
    if ($user->isEmpty()) {
        // do something
    }
    
    //或者
    
    if ($user->count()) {
        // do something
    }
  • bayue
    6个月前

    file

    collection是实现了Countable的。

  • liyu001989 MOD 2
    6个月前

    @bayue 是的

    你可以
    $users = User::all(); 
    if ($users->isEmpty()) {
        // do something
    }
    if ($users->isNotEmpty()) {
        // do something
    }
    if ($users->count()) {
        // do something
    }
    if (count($users)) {
        // do something
    }
    
    但是不能
    if ($users) {
        // it's wrong
    }
  • MIsakas 在"什么都不会还异常淡定"和"未来一片迷茫却不为所动“的领域有着深刻的研...
    6个月前

    前几天在电脑上部署环境,用的是 homestead 的最新版本,laravel 5.3 很迷的报错了,百度了一下才知道这个问题

  • xuanjiang1985 人生苦短,用脚本语言。 1
    6个月前

    用find不好,一般用findOrFaill, 不过这样也不好。报错都不好处理

  • storefee
    6个月前

    @xuanjiang1985 不是find不好,是有的场景中是由前端来决定显示内容和方式,此时是不能用findOrFail的。

  • 沈益飞
    6个月前

    可以这样

    if ($user->exists()) {
    }
  • Seaony 山無陵,江水為竭。冬雷震震,夏雨雪。天地合,乃敢與君絕。
    6个月前

    @bayue 很好奇是什么字体,蛮好看的

  • Seaony 山無陵,江水為竭。冬雷震震,夏雨雪。天地合,乃敢與君絕。
    6个月前

    @bayue thx

  • will_lin
    3个月前

    5.5以前版本的Builder scope部分就会出现这个问题,5.5的这个部分用count((array) $this->wheres)类型转换了

暂无评论~~
您需要登陆以后才能留下评论!

Composer 中国全量镜像

Top 100 扩展包

Lumen 中文文档

Laravel 速查表

Laravel 中文文档

Laravel 项目开发规范

Laravel 开发环境部署

Elasticsearch-PHP 中文文档

Lumen 中文文档

GraphQL PHP 中文文档

社区文档撰写指南

TDD 构建 Laravel 论坛笔记

PHP PSR 标准规范

PHP 设计模式全集

Dingo API 中文文档