PHP - 仅接受特定类的数组

Eli*_*hen 8 php arrays class

假设我有一个Product类,我怎么能告诉PHP我只想接受Array Product

换句话说,有没有办法做这样的方法?:

private function method(Product[] $products)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

我想过做这样的事情:

private function validate($products)
{
    foreach ($products as $product)
        if (!is_a($product, 'Product')
            return false;

    // ...
}
Run Code Online (Sandbox Code Playgroud)

它可以工作,但我不喜欢添加一堆行只是为了确保它是一个" Product[]".

Mac*_*ity 5

您只能输入任何容器的提示.所以你必须这样做

private function method(Array $products)
Run Code Online (Sandbox Code Playgroud)

PHP只能在给定的类型提示中验证参数本身,而不能验证参数可能包含的任何内容.

验证数组的最佳方法是循环,如你所说,但我会稍微改变一下

private function validate(Array $products)
{
    foreach($products as $product)
        if (!($product instanceof Product))
            return false;
}
Run Code Online (Sandbox Code Playgroud)

这样做的好处是可以避免函数调用的开销

另一个想法是创建一个包装类

class Product_Wrapper {
     /** @var array */
     protected $products = array();

     public function addProduct(Product $product) {
         $this->products[] = $product;
     }

     public function getProducts() {
         return $this->products;
     }
}
Run Code Online (Sandbox Code Playgroud)

这样,您的包装器不能包含除实例之外的任何内容 Product