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;
简短的回答是否定的。
我的理解是,强制执行这样的事情会带来严重的性能问题。有些人想要一路走下去并拥有完整的泛型,其他人只想要类型安全的集合。有人担心“先”实施后者可能会阻碍前者未来的发展。所以我们处于停滞状态。 社区中偶尔会有这样的讨论:
https://externals.io/message/108175编辑根据您如何解释问题,@Pierre 的答案可以被认为更正确,因为OP说“类型提示”,尽管他们显示了“类型声明”。 不久前有一个
好帖子争论如何称呼它的含义,并且 PHP 的实现是不是提示而是声明。有些人认为,虽然称其为“提示”用词不当,但无论核心发生什么变化,社区仍然会称其为提示。然而,他们最终确实更新了文档,以使用“类型声明”。 就我个人而言,我发现自己仍然对显式类型声明说“类型提示”,但我尝试捕捉并纠正自己。我这样做是因为我试图改变我的心态,这样如果我与非 PHP 人员(通常是 JavaScript 人员)交谈,他们就知道我不是在谈论 IDE 提示,而是真正的语言功能。
/** @var Task[] $tasks */
private array $tasks;
<?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 对象数组完全相同。