PHP 7.2 中 count 更加严格了

先贴代码
file

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

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

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

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

其实可以这样,

$user = User::find(1);
if ($user) {
    do something
}
本帖已被设为精华帖!
本帖由 Summer 于 6年前 加精
liyu001989
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 19
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
}
6年前 评论
$users = User::where('status',1)->get();
dd($users->count());    //我一般通过这个判断
6年前 评论

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

6年前 评论
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
}
6年前 评论

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

6年前 评论

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

5年前 评论

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

6年前 评论

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

6年前 评论
宇宙最厉害

可以这样

if ($user->exists()) {
}
6年前 评论

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

6年前 评论

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

6年前 评论

file

collection是实现了Countable的。

6年前 评论

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

6年前 评论
$user = User::all();
if ($user) {
    //如果为空也成立的
}
6年前 评论

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

6年前 评论
liyu001989

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

6年前 评论
nff93

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

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!