PHP 7.2 中 count 更加严格了
48

先贴代码
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
}
本帖已被设为精华帖!
本帖由 Summer 于 10个月前 加精
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 20

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

10个月前
$users = User::where('status',1)->get();
dd($users->count());    //我一般通过这个判断
10个月前

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

10个月前

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

10个月前
liyu001989

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

10个月前

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

9个月前
$user = User::all();
if ($user) {
    //如果为空也成立的
}
9个月前

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

9个月前
liyu001989

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
}
9个月前

file

collection是实现了Countable的。

9个月前
liyu001989

@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
}
9个月前

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

9个月前

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

9个月前

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

9个月前
沈益飞

可以这样

if ($user->exists()) {
}
9个月前

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

9个月前

@bayue thx

9个月前

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

6个月前
sheldon

laravel 5.5以下的版本,php更新到7.2;丫的用软删除(Collections->delete();),就会报这个错。:smile: 纯属瞎折腾。。。

2个月前

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