簡體   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