PHP 8.3 中是否有针对特定类的对象数组的类型提示?

问题描述 投票:0回答:3

PHP 8.3中是否有

类型提示
允许使用
ExampleClass[]
来声明它是ExampleClass类的
对象数组


在我的具体情况下,

ExampleClass
称为
Task

我想要但不起作用:

private Task[] $tasks;

我的 PHPStorm IDE 告诉我 仅在文档类型中允许使用复数类型
- 也就是说,仅在

PHPDoc
中使用
Tasks[]
就完全没问题了。但我想使用plain PHP

错误是:

PHP Parse error:  syntax error, unexpected token "[", expecting variable


如果我只需要一个对象

Task
而不是一组对象
Task[]
,它可以使用:

private Task $task;

这是我当前的工作解决方法:

private array $tasks;
php type-hinting php-8.1 php-8.2
3个回答
20
投票

简短的回答是否定的。

我的理解是,强制执行这样的事情会带来严重的性能问题。有些人想要一路走下去并拥有完整的泛型,其他人只想要类型安全的集合。有人担心“先”实施后者可能会阻碍前者未来的发展。所以我们处于停滞状态。 社区中偶尔会有这样的讨论:

https://externals.io/message/108175

编辑

根据您如何解释问题,@Pierre 的答案可以被认为更正确,因为OP说“类型提示”,尽管他们显示了“类型声明”。 不久前有一个

好帖子

争论如何称呼它的含义,并且 PHP 的实现是不是提示而是声明。有些人认为,虽然称其为“提示”用词不当,但无论核心发生什么变化,社区仍然会称其为提示。然而,他们最终确实更新了文档,以使用“类型声明”。 就我个人而言,我发现自己仍然对显式类型声明说“类型提示”,但我尝试捕捉并纠正自己。我这样做是因为我试图改变我的心态,这样如果我与非 PHP 人员(通常是 JavaScript 人员)交谈,他们就知道我不是在谈论 IDE 提示,而是真正的语言功能。


10
投票

/** @var Task[] $tasks */ private array $tasks;



4
投票

<?php class Collection extends ArrayObject { public function __construct(array $items = []) { foreach ($items as $item) { $this->validate($item) } } public function append($value): void { $this->validate($value); parent::append($value); } public function offsetSet($key, $value): void { $this->validate($value); parent::offsetSet($key, $value); } protected function validate($value): void { if (!$value instanceof Task) { throw new InvalidArgumentException( 'Not an instance of Task' ); } } }

现在您可以返回类型提示为 
Collection

的对象,并且其行为与 Task 对象数组完全相同。

    

© www.soinside.com 2019 - 2024. All rights reserved.