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

25

PHP 8.2 中是否有类型提示,允许使用 ExampleClass[] 声明它是类 ExampleClass对象数组


在我的具体情况中,ExampleClass 被称为 Task我想要但不起作用的是:
private Task[] $tasks;

我的PHPStorm IDE告诉我复数类型仅允许在文档类型中使用
- 这意味着只有在PHPDoc中使用Tasks[]才是完全正确的。但我想使用纯PHP

错误是:PHP解析错误:语法错误,意外的标记“[”,期望变量


如果我只需要一个对象Task而不是对象数组Task[],那么可以使用以下代码:

private Task $task;

这是我目前正在使用的解决方案:

private array $tasks;

1
参见:https://dev59.com/G2Ii5IYBdhLWcg3w_AfV https://dev59.com/WHRA5IYBdhLWcg3w8SeJ - IMSoP
3个回答

19
简短回答是不行的。 我的理解是,强制实施此类事情会带来可怕的性能问题。有些人希望全面实现泛型,而有些人则只想要类型安全的集合。有些人担心首先实现后者可能会妨碍将来实现前者的发展。所以我们陷入了僵局。 社区中偶尔会有讨论,比如这个链接:https://externals.io/message/108175

4

虽然这种复合类型没有可用的类型提示,但有一个可以强制类型的解决方法。从ArrayObject创建一个子类并验证添加到ArrayObject的所有值。然后,您可以对新子类进行类型提示。

<?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对象数组完全相同。


欢迎来到SO并感谢您的贡献。 - WebDevPassion
对于那些试图实现这种方法的人,请记住在循环后构造函数缺少父级构造函数调用 - parent::__construct($items); - Zippp
“!$value instanceof static” 而不是 “!$value instanceof Task” 会使代码更通用吗? - psychoslave

4
如果你正在使用 PhpStorm、PHPStan 或 Psalm,可以在 PHPDocs 中定义类型,这些工具将进行类型检查,以及其他许多功能。
/** @var Task[] $tasks */
private array $tasks;

这并不意味着代码本身是类型安全的。 - Nico Haase
3
最初的问题是:在PHP 8.2中,是否有特定类的对象数组的类型提示? - Pierre
请通过编辑您的答案添加所有澄清内容。 - Nico Haase
1
适用于IntelliJ和其他JetBrains产品。 - Richard Tyler Miles

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接