PHP - 只接受特定类的数组

标签 php arrays class

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

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

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

我想过做这样的事情:

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

    // ...
}

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

最佳答案

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

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 - 只接受特定类的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38828696/

相关文章:

php - Mysql 查询查找多个表的多个列中共有的记录。

java - 在线性 (O(N)) 时间内对数组进行排序

javascript - 如果填写字段=数组则为JAVASCRIPT

c++ - 无法访问类中的公共(public)字段 | C++

php - CKeditor 表单将帖子添加到数据库时出现问题

php - liip_imagine 是否将 jpeg/jpg/png 文件转换为 webp? - symfony PHP 7.4.9

javascript - jQuery 即时创建多维数组

java - Java 的 "Class.forName"是否扫描所有 jar 中的所有类名?

C++ 类的复制构造函数

php - mySql 数据库连接到错误的服务器