好吧,这可能是微不足道的。但我被卡住了。我需要传递一个参数给一个函数,但需要像这样输入提示:
private function printUsers(Collection<User> users) { foreach($users as $user) { print($user->fullName) } }
我如何键入提示这个集合,因为我想要一个特定模型的集合?
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)它只在迭代时有效,即它不是真正的泛型
$users
User
User[]
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 } } }
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) } }
请参阅此处的文档。
3条答案
按热度按时间lb3vh1jj1#
PHP不支持泛型,但是如果你使用的是特定的IDE(至少PhpStorm是这样做的),你可以把generic in the docblock:
然而,这仍然不起作用,因为Laravel还没有类型提示集合为泛型(至少还没有,这将在Laravel 9中出现)。
解决此问题的一般方法(再次使用docblock)是执行以下“hacky”类型提示:
这将类型提示
$users
作为具有User
成员的数组可访问变量,它可能足够接近您的需要,但是:(a)完成仅在支持
User[]
语法的IDE中有效(b)它只在迭代时有效,即它不是真正的泛型
332nm8kg2#
你不能,除非你创建一个UserCollection类型。看起来你正在尝试应用一些其他的OOP语言概念(例如Java)。
一个简单的方法是维护Collection参数类型,并在函数内部计算参数,如下所示:
eqzww0vc3#
如果你需要这样做,最好是创建Custom Collection,就像Gui提到的那样。要对你的User Model做这个方法。
然后,您可以像这样使用它:
请参阅此处的文档。