Laravel类型提示雄辩集

s6fujrry  于 2022-11-18  发布在  其他
关注(0)|答案(3)|浏览(102)

好吧,这可能是微不足道的。但我被卡住了。
我需要传递一个参数给一个函数,但需要像这样输入提示:

private function printUsers(Collection<User> users) {
     foreach($users as $user) {
       print($user->fullName)
     }
    }

我如何键入提示这个集合,因为我想要一个特定模型的集合?

lb3vh1jj

lb3vh1jj1#

PHP不支持泛型,但是如果你使用的是特定的IDE(至少PhpStorm是这样做的),你可以把generic in the docblock

/**
    * @param Collection<User> $users
    */
   private function printUsers(Collection $users) {
     foreach($users as $user) {
       print($user->fullName)
     }
    }

然而,这仍然不起作用,因为Laravel还没有类型提示集合为泛型(至少还没有,这将在Laravel 9中出现)。
解决此问题的一般方法(再次使用docblock)是执行以下“hacky”类型提示:

/**
    * @param Collection|User[] $users
    */
   private function printUsers(Collection $users) {
     foreach($users as $user) {
       print($user->fullName)
     }
    }

这将类型提示$users作为具有User成员的数组可访问变量,它可能足够接近您的需要,但是:
(a)完成仅在支持User[]语法的IDE中有效
(b)它只在迭代时有效,即它不是真正的泛型

332nm8kg

332nm8kg2#

你不能,除非你创建一个UserCollection类型。看起来你正在尝试应用一些其他的OOP语言概念(例如Java)。
一个简单的方法是维护Collection参数类型,并在函数内部计算参数,如下所示:

private function printUsers(Collection $users) {

    foreach($users as $user) {
        try {
            $user = (User) $user; // Not strictly necessary.
            print($user->fullName);
            
        } catch (Exception $e) {
            // Resolve exception
        }
    }
}
eqzww0vc

eqzww0vc3#

如果你需要这样做,最好是创建Custom Collection,就像Gui提到的那样。要对你的User Model做这个方法。

public function newCollection(array $models = []) : Collection 
{
   return new UserCollection($models);
}

然后,您可以像这样使用它:

private function printUsers(UserCollection $users) {
  foreach($users as $user) {
    print($user->fullName)
  }
}

请参阅此处的文档。

相关问题