PHP 7.2 中 count 更加严格了

分享 liyu001989 ⋅ 于 1个月前 ⋅ 最后回复由 Seaony 1周前 ⋅ 9241 阅读

先贴代码
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
}

liyu001989

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

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

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

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

  • nff93
    1个月前

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

  • liyu001989
    1个月前

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

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

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

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

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

  • liyu001989
    4周前

    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
    3周前

    file

    collection是实现了Countable的。

  • liyu001989
    3周前

    @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 不是程序员,在"什么都不会还异常淡定"和"未来一片迷茫却不为所动“的领域...
    2周前

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

  • xuanjiang1985 人生苦短,用脚本语言。
    2周前

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

  • storefee
    2周前

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

  • 沈益飞
    2周前

    可以这样

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

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

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

    @bayue thx

暂无评论~~
  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
Ctrl+Enter