2013-02-28 40 views
2

我有一個類表示一個集合實體:它只有一個屬性,一個數組。本課實現\Countable,\IteratorAggregate,對於這個問題最重要的是\ArrayAccess我必須實現哪個SPL接口才能在對象上使用usort()函數?

但在使用時:

 usort($collectionData, function($a, $b) { 
      return ($a->getPosition() > $b->getPosition()); 
     }); 

得到以下開捕異常:

警告:usort()預計參數1是數組,對象在 /家/阿蘭/工作區給定的/(...)n.php線1057(500內部服務器錯誤)

我可以使用一箇中間變量:

 $data = $collectionData->getData(); 
     usort($data, function($a, $b) { 
      return ($a->getPosition() > $b->getPosition()); 
     }); 
     $collectionData->setData($data); 

但想知道是否有一個SPL接口可以通過usort()陣列參數類型的期望。

回答

1

不是我所知道的。沒有界面將使你的對象也是array,這就是你需要傳遞給usort()。但是,您可以通過將usort()方法添加到班級中來將此行爲封裝在班級中。

class CollectionEntity implements Countable, IteratorAggregate, ArrayAccess { 

    private $data = array(); 

    /* other methods omitted for simplicity */ 

    public function usort(Closure $callback) { 
    usort($this->data,$callback); 
    } 


} 
+0

這是唯一的方式簡單做AFAIK作爲以及 – JamesHalsall 2013-02-28 13:26:20

+0

當然你的方式比分鐘好即如果我們在PHP中有很多本地數組操作函數,那麼無法重載'array'類型是非常不幸的。 – 2013-02-28 13:33:35

+0

順便說一句:這看起來像一個偉大的使用案例'特質' – Mchl 2013-02-28 13:37:31

2

我真的覺得你應該繼承的唯一類是ArrayIterator因爲它已經實現

ArrayIterator實現迭代器,Traversable的,ArrayAccess接口,SeekableIterator,可數,序列化

而且還支持

public void uasort (string $cmp_function) 
public void uksort (string $cmp_function) 

And so many other methods

所以你類是

class CollectionEntity extends ArrayIterator { 
} 

然後

$collectionData->uasort(function ($a, $b) { 
    return ($a->getPosition() > $b->getPosition()); 
}); 
+0

是的,你可以實現'offsetSet' ....正如我所說''ArrayIterator''也實現'ArrayAccess' – Baba 2013-02-28 14:12:07

+0

是的,我看到剛寫完我的評論這就是爲什麼我刪除它)。 – 2013-02-28 15:52:51

相關問題