类型提示模型数组
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
对象中的 array
或 Collection
,然后根据您提供的类型提示检查所有这些对象。
示例:
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
【讨论】:
以上是关于类型提示模型数组的主要内容,如果未能解决你的问题,请参考以下文章