2017-09-04 104 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.)

相關問題