繁体   English   中英

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

[英]Is there a type hint for an array of objects of a specific class in PHP 8.1?

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


在我的具体情况下, ExampleClass被称为Task

我想要但不起作用:

private Task[] $tasks;

我的 PHPStorm IDE 告诉我复数类型只允许在文档类型中
- 说只有在PHPDoc中使用Tasks[]就可以了。 但我想使用普通的 PHP

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


如果我只需要一个 object Task而不是一个对象数组Task[]它可以使用:

private Task $task;

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

private array $tasks;

最简洁的答案是不。

我的理解是,执行这样的事情会带来可怕的性能问题。 有些人想一直到 go 并拥有完整的 generics,其他人只想要类型安全的 collections。 有人担心,实施后者可能会阻碍前者未来的发展。 所以我们处于停滞状态。

社区里偶尔会有这样的讨论: https://externals.io/message/108175

虽然没有可用于此类复合类型的类型提示,但有一种强制类型的解决方法。 从 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 对象数组完全一样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM