PHP:确保数组包含仅来自某个类的对象

时间:2017-09-04 11:00:50

标签: php arrays class

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

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;  
    }
}

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

3 个答案:

答案 0 :(得分:3)

创建一个扩展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,它可以作为参数传递给期望数组的函数(explode(),f.e。)

答案 1 :(得分:0)

您可以使用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);

答案 2 :(得分:0)

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

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

doSomething(new MyObject, new MyObject, new MyObject);