【问题标题】:PHP: Ensure that an array contains objects from only a certain classPHP:确保数组仅包含来自某个类的对象
【发布时间】:2018-02-12 14:34:45
【问题描述】:

在我的一些设置器中,我传递了一个对象数组。我想确保它只包含给定类的实例。阅读文档,这就是我所做的:

class Foo
{
    public function __construct()
    {

    }
}

class ErrorFoo
{
    public function __construct()
    {

    }
}

$arrayObject = Array();

array_push($arrayObject, new Foo());
array_push($arrayObject, new Foo());
array_push($arrayObject, new ErrorFoo());

$error = false;
foreach ($arrayObject as $obj)
{
    if ( $obj instanceof Foo ) 
    {
        echo "ok" . '<br>';
    }
    else 
    {
        echo "error" . '<br>';
        $error = true;  
    }
}

你知道比这样遍历数组更简单的方法吗?

【问题讨论】:

  • 不确定是否总是设置$error= true; 有帮助。
  • oups,更正
  • 作为 setter 函数的一部分,您可以验证传递的对象类型吗?如果类型与您想要的不匹配,则抛出异常。这样做将确保在任何 getter 中返回的对象都是预期的类型。
  • @Goon3r 如果我传递一个数组作为参数,那么传递的对象类型是数组,不是吗?

标签: php arrays class


【解决方案1】:

创建一个扩展ArrayObject 的类,重新定义其offsetSet() 方法并检查它。使用此类而不是普通数组来存储 Foo 类型的对象。

class ArrayOfFoo extends ArrayObject
{
    public function offsetSet($index, $newval)
    {
        // Verify the input 
        if (! $newval instanceof Foo) {
            // do something
            throw new InvalidArgumentException('Invalid type');
        }

        // Let the parent class do its job
        parent::offsetSet($index, $newval);
    }
}

ErrorFoo 类型的对象添加到数组中时,此代码会引发异常:

$ArrayObject = new ArrayOfFoo();

$ArrayObject[] = new Foo();
$ArrayObject[] = new Foo();
// This throws an exception
$ArrayObject[] = new ErrorFoo();

ArrayObject 类的实例的使用方式与array 的使用方式相同(设置、取消设置和从中获取值)。它的方法getArrayCopy() 可用于获取array,该array 可以作为参数传递给需要数组的函数(explode(),f.e.)

【讨论】:

    【解决方案2】:

    您可以为此使用array_maparray_walk

    https://php.net/manual/en/function.array-map.php

    array_map 示例:

    function isInstanceOfFoo($n)
    {
        if(!($n instanceof Foo)) {
          throw new Exception('Error');
        }
    }
    
    $ArrayObject = Array();
    
    array_push($ArrayObject, new Foo());
    array_push($ArrayObject, new Foo());
    array_push($ArrayObject, new ErrorFoo());
    
    array_map(isInstanceOfFoo, $ArrayObject);
    

    https://php.net/manual/en/function.array-walk.php

    array_walk 示例:

    function isInstanceOfFoo($n, $k)
    {
        if(!($n instanceof Foo)) {
          throw new Exception('Error');
        }
    }
    array_walk($ArrayObject, isInstanceOfFoo);
    

    【讨论】:

    • 链接是 /de/ 而不是 /en/ 无法编辑,因为它至少需要 6 个字符
    • 你可以扩展它来传递类名 - 所以变成 function isInstanceOf( $class, $n) 和 test 变成 $n instanceOf $class。这就像使用 Java 泛型一样。
    【解决方案3】:

    您可以使用可变参数来强制类型:

    function doSomething(MyObject ...$array)
    {
         // $array contains only MyObject instances in it
    }
    
    doSomething(new MyObject, new MyObject, new MyObject);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-14
      • 2011-04-02
      • 2011-04-02
      相关资源
      最近更新 更多