Laravel:找出变量是否是集合

Alb*_*ert 22 php collections laravel

我想知道变量是否是一个集合.

我不能使用is_object(),因为即使它不是集合也是如此.现在我使用它,它的工作原理:

if(is_object($images) && get_class($images) != 'Illuminate\Database\Eloquent\Collection') {
Run Code Online (Sandbox Code Playgroud)

但我觉得这太丑了,我花时间问你另一种解决方案.

你有什么主意吗?

小智 37

你不能用

if(is_a($images, 'Illuminate\Database\Eloquent\Collection')) {
    ....do whatever for a collection....
} else {
    ....do whatever for not a collection....
}
Run Code Online (Sandbox Code Playgroud)

要么

if ($images instanceof Illuminate\Database\Eloquent\Collection) {

}
Run Code Online (Sandbox Code Playgroud)

  • `is_a`自PHP 5.0以来已被弃用,所以虽然它正在工作,但它并不是最好的建议. (4认同)
  • @Bogdan`is_a`在5.0.0中已弃用,但自5.3.0起已恢复(不再弃用).但是,考虑到历史,我仍然会推荐`instanceof`而不是`is_a`.另外,它看起来更好一点恕我直言. (4认同)
  • 注意:我必须使用 \Illuminate\Database\Eloquent\Collection (带前导反斜杠)... (3认同)

Kon*_*hog 27

这里使用的类不正确.在一般意义上,您应该测试基类.

use Illuminate\Support\Collection;

....
if($images instanceof Collection) { 
 ....
}
Run Code Online (Sandbox Code Playgroud)

  • 这是这里唯一正确的答案. (3认同)

Joe*_*pie 6

function is_collection($param): bool
{
    return (bool) (($param instanceof \Illuminate\Support\Collection) || ($param instanceof \Illuminate\Database\Eloquent\Collection));
}

Run Code Online (Sandbox Code Playgroud)

如果您经常使用它,您可能只想为其提供功能。

@Konchog 和 @Jonathan Ma 答案的组合。


Jon*_* Ma 5

@Konchong 的答案指出了这一点,但我想向其他人明确指出这一点。

Illuminate\Support\CollectionLaravel 中许多类型的集合使用的基类与 之间存在差异,Illuminate\Database\Eloquent\Collection它扩展了基类,但具有附加功能,并且在其代码中将基类别名为 BaseCollection。这是通过模型类和get()等函数执行查询生成器时得到的结果。一个普通的集合是用它制作的collect(["my", "array"])

请注意,这两个类都会产生一组不同的方法。例如,loadloadMissingRelation和许多其他方法存在于子类中,而父类中不存在。然而,数据库子类中的方法内部有许多逃生口 if 语句,这些语句确保如果有人以非预期的方式意外使用子类(例如向集合中添加元素),则收藏不会中断。

请注意,以下内容是正确的

User::get() instanceof \Illuminate\Database\Eloquent\Collection;
User::get() instanceof \Illuminate\Support\Collection;
collect(["hello", "i", "am", "a", "base", "collection"]) instanceof \Illuminate\Support\Collection;
Run Code Online (Sandbox Code Playgroud)

请注意,以下内容是错误的

collect(["hello im a", "base collection"]) instanceof \Illuminate\Database\Eloquent\Collection;
is_array(collect(["hello im a", "base collection"]));
Run Code Online (Sandbox Code Playgroud)

请注意,虽然集合本质上是数组的包装器,并且具有非常强大的方法,但它不是数组,并且在标准 php 数组函数中经常会失败或抛出异常。