2011-08-25 35 views
3

爲什麼只有幾個PHP數組函數可用於ArrayObject類的方法?例如asort()可用,但walk()和許多其他不是。可憐的PHP ArrayObject設計

$s= new ArrayObject(array(1,3,4,5,6,4)); 
$x= $s->asort();     //implemented 
$x= $s->sum();      //not implemented 
$x= array_sum($s->getArrayCopy()); //not an OO manner! 
//sum is an example, consider:array_map,array_walk,array_merge .... 

請注意,我仔細閱讀了文檔。我的問題是WHY PHP團隊只是在ArrayObject類中嵌入了一個數組函數的子集(應該封裝與數組相關的需求)。這不是一個糟糕的設計嗎? 爲什麼我們應該擴展這個類,並再次在這個類中嵌入數十個函數?是合理的嗎?

+1

@Reza真的我認爲這只是歸結爲能夠自我擴展自我需求。無論如何,你不會爲ArrayObject使用一個數字數組,因此在那裏名稱爲Object。你可以有一個班級收集,但你會如何總結?你必須定義它。你寧願沒有數組類嗎? – Matt

+0

重複的關閉http://stackoverflow.com/questions/7174430/arrayobject-class-in-php – salathe

+0

@Reza,你的問題的答案是*因爲這是作者決定*。如果您想知道原因,希望他們能記住,那麼我可以將他們的聯繫方式轉發給您? – salathe

回答

4

想一想,一組對象應該能夠原生簡單地完成。如果我有一些書,我希望能夠對它們進行排序,我希望能夠在某個位置獲得一個,我希望能夠遍歷它們等。我不想要的是能夠將它們全部添加。如果我爲該對象添加了一個sum函數,那麼這意味着該對象的每個實例都會有一個sum函數 - 這是一個奇怪且意想不到的用例。

ArrayObject在很多意義上,它與PHP的array曾經管理過的傳統陣列的想法非常接近。我相信因爲這個原因,它應該會更快。

+0

您是否意味着ArrayObject僅用於一個對象數組?所以它的名字應該是ObjectsArray! 我喜歡在Java中使用所有數組類型的OO類。 – PHPst

+0

不是。它是一個功能類似陣列的對象。問題是,PHP中的數組並不是真正的數組,就像它們在C或Java中那樣。 – cwallenpoole

2

ArrayObject不僅適用於像int/float這樣需要進行求和運算的元素的數組。對於所有ArrayObject類型對象,array_sum不是必需的。您應該擴展ArrayObject,如NumberArrayObject以擁有sum方法。

+0

總和就是一個例子,關於其他函數呢。 PHP是不是類型強大,你知道 – PHPst

+0

@Reza喜歡什麼? – xdazz

+1

array_map,array_walk,array_merge .... – PHPst

1

* Array functions page上的所有內容都打破了這種面向對象的原則。

*一切不在this page

原因很簡單:創建PHP時,並沒有太多的OOP標準。 OOP是在事後添加的,並在PHP5中進行了改進。當PHP創建時,原語(和數組)不被視爲對象,所以這些函數存在。將函數與它們所關聯的數據類型耦合起來確實很有意義,但PHP將始終保持它的原始數組函數。