【问题标题】:PHP - Accept only array of specific classPHP - 只接受特定类的数组
【发布时间】:2016-12-14 04:45:57
【问题描述】:

假设我有一个 Product 类,我如何告诉 PHP 我只想接受 Product 的数组?

换句话说,有没有办法做类似这种方法的事情?:

private function method(Product[] $products)
{
    // ...
}

我想过做这样的事情:

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

    // ...
}

它可以工作,但我不喜欢这种添加一堆行只是为了确保它是“Product[]”的想法。

【问题讨论】:

  • 因为没有类型化的数组,所以也没有这样的东西。如果您首先为产品列表创建自己的类,您也许可以实现它。然后可以在类型提示参数中使用该类,并且该类本身必须确保只能将产品添加到其内部数据数组中。

标签: php arrays class


【解决方案1】:

无论容器是什么,您都只能输入提示。所以你必须这样做

private function method(Array $products)

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

验证数组的最佳方法是如您所说的循环,但我会稍作改动

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

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

另一个想法是制作一个包装类

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

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

     public function getProducts() {
         return $this->products;
     }
}

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

【讨论】:

  • 感谢您的回答。我有点希望 PHP 实现类似的东西:\ 如果没有更好的答案,我会将此标记为答案。再次,谢谢你:)
  • @EliyaCohen 我确实还有一个想法。检查我的编辑
猜你喜欢
  • 1970-01-01
  • 2022-10-04
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
  • 2017-07-10
  • 1970-01-01
  • 1970-01-01
  • 2015-03-28
相关资源
最近更新 更多