2017-09-04 100 views
0

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

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

你知道不是通过数组这样重复一个简单的方法?

+0

不确定是否总是设置'$ error = true;'帮助。 –

+0

oups,已修正 –

+4

作为setter函数的一部分,您可以验证传入的对象类型?抛出异常如果类型不符合你想要的。这样做将确保任何获取器中返回的对象都是预期的类型。 – JParkinson1991

回答

0

你可以使用array_map或array_walk此:array_map的

http://php.net/manual/en/function.array-map.php 例子:

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

http://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); 
+0

链接是/ de /而不是/ en /无法编辑,因为它至少需要6个字符 –

+2

您可以扩展它以传递类名 - 因此变成'function isInstanceOf($ class,$ n)'并测试变成'$ n instanceOf $ class'。这就像使用Java泛型一样。 –

2

创建扩展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.)

相关问题