类型提示模型数组

Posted

技术标签:

【中文标题】类型提示模型数组【英文标题】:Typehinting array of models 【发布时间】:2015-11-10 02:27:43 【问题描述】:

我想知道你是否可以在 php(更明确地说是 Laravel)中输入模型数组。

代码示例:

use App\User;

public function index(User $user)

    // do something with the user

我的问题是,有没有办法输入用户模型数组:

use App\User;

public function index(array User $users) //this is wrong ..

    // do something with the users

【问题讨论】:

因为它是 Laravel,你可以输入提示 Eloquent\Collection,如果你期待 Eloquent 查询的结果,但显然你不会知道它是用户集合! 可能将Eloquent\Collection 扩展到App\UserCollection 好主意,你能扩大一下你的做法吗? 【参考方案1】:

在 PHP 5.6+ 中,您可以使用 variable length argument lists 来实现您想要的。

在调用函数时解包变量,函数在其签名中使用可变参数。因此,您无需传递一组 User 对象,而是解压缩 User 对象中的 arrayCollection,然后根据您提供的类型提示检查所有这些对象。

示例:

function deleteUsers(User ...$users)

    // delete the users here


$users = [$user1, $user2, $user3];

deleteUsers(...$users);

解包将在常规 array 和 Laravel Collection 对象或任何其他 Traversable 变量或文字上工作,以输入参数列表。

这相当于执行以下操作:

deleteUsers($user1, $user2, $user3);

【讨论】:

不明白为什么这不是公认的答案或为什么它有 0 票:eye_roll_emoji: 谢谢罗伯特。你得问@rvandersteen :)【参考方案2】:

不,您不能这样做。您可以做的最好的事情是将参数键入提示为数组。你可以在这里阅读更多关于 PHP 类型提示的信息:http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration

更新 在 PHP 5.6+ 中,您可以使用可变长度参数列表来实现您想要的。检查answer below

【讨论】:

【参考方案3】:

我知道已经接受了一个答案,但这取决于您的 IDE 实现 phpDoc 的程度(PhpStorm 肯定支持这一点,但我们在去年让 Eclipse 支持它时遇到了问题)。

phpDoc 通过Class[] 语法支持类型化数组。所以你可以这样做:

use App\User;

/**
 * @var User[] $user
 */
public function index(array $users)

    // do something with the users

这不会限制某人将一组非User 对象传递给index(如果他们传入一个字符串,则会提示array 类型),但它会为他们提供指导关于预期的内容,它将允许您在执行时获得代码提示:

foreach ($users as $user) 
    $user->dele // Depending on IDE, this will code hint/complete "delete()"

phpDoc Array Documentation

【讨论】:

以上是关于类型提示模型数组的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 集合/模型的类型提示闭包

返回此数组的泛型类型的类型提示数组

Laravel 类型提示,模型保存时 id 返回 null

Angular Schematics 提示数组类型

在 PHPStorm 中为 CakePHP 模型行为提供类型提示

类型提示 2D numpy 数组