【问题标题】: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
  • 好主意,你能扩大一下你的做法吗?

标签: php arrays laravel type-hinting


【解决方案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

    【讨论】:

      猜你喜欢
      • 2021-11-10
      • 2015-08-05
      • 2021-02-17
      • 2015-05-23
      • 2021-06-13
      • 2019-09-08
      • 2021-08-29
      • 1970-01-01
      • 2014-08-08
      相关资源
      最近更新 更多