2009-10-16 2 views
16

PHP5를 배웠습니다. (PHP4를 마지막으로 확인한 시간) PHP5 OO가 PHP4보다 자바와 비슷하지만 여전히 문제가 있다는 것을 알게되어 기쁩니다. 내 Java 배경 때문에 매우 불편하게 느껴진다. ARRAYS.PHP에서 Java와 유사한 컬렉션

"Proffesional PHP6"(Wrox)을 읽고 있는데 자체 Collection 구현을 보여줍니다. SPL을 기준으로 http://aheimlich.dreamhosters.com/generic-collections/Collection.phps과 같은 다른 클립을 찾았습니다. SPL (ArrayObject)에 Collection이 있다는 것을 발견했습니다.

그러나 PHP에서 Collections를 사용하는 사람들을 실제로 볼 수 없기 때문에 놀랍습니다. 배열을 선호하는 것 같습니다.

Java에서 기본 배열 대신 ArrayList를 사용하는 것처럼 PHP에서 Collections를 사용하는 것이 좋습니다. 결국, php 배열은 자바 배열과 정말 비슷하지 않습니다.

+3

PHP의 배열보다 Java 컬렉션의 장점을 지적 할 수 있습니까? 찾고있는 enterprisey를 제외하고? –

+0

사실, PHP에서 세트 구현을하는 것이 좋았지 만 파이썬 세트와 같은 것입니다. –

+0

아래의 답변에서 정말 간단한 구현을 제공했습니다. –

답변

19

Java의 모음은 강력한 형식의 언어이므로 많은 의미가 있습니다. '자동차'라고하는 컬렉션과 '오토바이'라는 또 다른 컬렉션이있는 것이 좋습니다.

그러나 PHP에서는 동적 유형 지정 특성으로 인해 모음의 형식을 희생하는 것이 일반적입니다. 배열은 다양한 객체 유형 (자동차, 오토바이 등)의 일반 컨테이너로 사용하기에 충분합니다. 또한, 어레이가 매우 쉽게 변형 될 수 있다는 사실 (적절한 오류 검사가 부재 한 경우 큰 단점이 될 수 있음) 때문에 더 많은 이점이 있습니다.

필자는 자바 배경에서 왔으며 PHP에서 Collections 디자인 패턴을 사용하면 멀티 스레딩, 메모리 할당 최적화, 반복기 없음 등의 이점을 많이 얻지 못한다는 사실을 발견했습니다.).

이러한 장점을 찾으려면 배열 주위에 래퍼 클래스를 구성하고 각 기능 (반복기 등)을 일괄 적으로 구현하는 것이 좋습니다.

+0

내 자신의 래퍼 클래스를 구성하는 것은 이러한 기본적인 작업에 비표준 클래스를 사용하는 단점이 있습니다. SPL의 ArrayObject는 래퍼인가? – ktulur

+1

동의합니다. 모든 사용자 정의 래퍼는 비표준이라는 단점이 있지만 실제로는 표준 Collections 래퍼가 없으므로별로 좋지 않을 수 있습니다. SPL의 ArrayObject에 대해 실제로 익숙하지 않았지만 문서 (http://www.php.net/~helly/php/ext/spl/classArrayObject.html)를 살펴보면 다음과 같은 래퍼 클래스 인 것으로 보입니다. 복제 함수와 반복자를 추가합니다. 이것이 당신이 필요로하는 전부라면, 나는 그것을 사용하는 것이 좋습니다. 그러나 동기화, linkedlist 대 arraylist 등이 필요한 경우 아마도 자신의 래퍼를 작성하거나 ArrayObject를 확장해야 할 것입니다. – Pras

+0

완전히 동의하지만 때로는 배열에 한 가지 유형의 객체 만 포함한다는 기본적인 보증을 원할 수도 있습니다. 내가 사용하는 간단한 구현이 - 내 대답을 참조하십시오. –

5

PHP 배열은 연관성이 있습니다 ... Java 배열보다 훨씬 강력하고 List <> 및 Map <>의 많은 기능을 포함합니다.

"좋은 생각"이란 무엇을 의미합니까? 그들은 다른 도구를 사용합니다. 한 언어를 사용하여 다른 언어를 사용하면 좌절감이 생깁니다.

+0

PHP에서 사용되는 OO 디자인 패턴이 많이 있고 PHP5 OO는 Java와 유사하므로 Collection을 사용하면 나에게 좋은 생각 같았다. . – ktulur

+2

PHP가 Java에서 물건을 빌린 것이 반드시 좋은 것은 아닙니다. –

+0

나는 혼란스러워한다. 당신은 "컬렉션"을 가지고 있습니다. 그들은 단지 "List"또는 "Map"으로 지칭되지 않습니다. PHP 배열은 동적으로 커집니다. 키/값 쌍을 연결할 수 있습니다. 세트는 약간 다른 짐승이지만 헤이, 거기에 너무 많이 쌓일 수는 없습니다. :) Java에서 오는 것은 틀림없이 이상한 세계이지만, 이러한 차이점과 그와의 절충점을 받아들입니다! –

3

필자도 PHP에서 Collection 유형 클래스를 찾지 못해서 다소 놀랐습니다. 배열은 내 경험에 몇 가지 실제 단점이 있습니다.

먼저, 조작하기 위해 사용할 수있는 기능의 수가 제한되어 있습니다. 예를 들어, 임의의 인덱스 위치에서 Collection으로 항목을 삽입하거나 컬렉션에서 항목을 임의로 제거 할 수 있어야합니다. PHP에서 배열에 내장 된 언어 함수를 사용하면 기껏해야 고통 스럽습니다.

둘째로, 첫 번째 지점의 일종으로 단순 푸시/팝 및 반복자 이상의 복잡한 수준에서 배열을 조작하는 깨끗하고 읽기 쉬운 코드를 작성하는 것이 최선입니다. 필자는 데이터 집약적 인 앱에서 다른 배열을 인덱싱하고 추적하기 위해 하나의 배열을 사용해야한다는 사실을 종종 알게됩니다.

프레임 워크에서 작업하는 것을 선호합니다 (개인 선택은 NOLOH). 거기에 Add, Insert, RemoveAt, RemoveRange 및 Toggle과 같은 기능을 가진 ArrayList라는 실제 Collection 클래스가 있습니다. 다른 PHP 프레임 워크에서도이 문제를 해결할 수 있다고 생각합니다.

6

저는 PHP에서 매우 프로 컬렉션 객체입니다. 유형 안전성을 추가하고, 검색, 정렬 및 조작 기능을 사용하기 쉽고, 올바른 OO 접근법을 표현하기보다는 배열과 유용하지만 절차 적 소스에서 서로 다른 패턴으로 작동하는 함수.

우리는 유형 안전성, 일관된 코딩 표준 및 높은 수준의 코드 재사용을 촉진하기 위해 깔끔하게 계승 된 다양한 목적으로 다양한 컬렉션을 보유하고 있습니다.

그러나 ultimatley, 그들은 모두 내부적으로 배열입니다!

정말 선택의 여지가 있지만 내 객체 지향 세계에서는 기본 클래스의 정렬 및 검색 알고리즘과 같은 코드를 쉽게 반복 할 수있는 세그먼트를 유지하기를 원하며 객체 표기법이 더 문서화되는 것을 발견했습니다.

0

PHP의 컬렉션 구현은 Varien Lib에서 제공하며,이 라이브러리는 OSL 라이센스가있는 Magento 코드의 일부입니다. 마 젠토 라이센스 및 코드 재사용 here에 대한 (추가 정보를 원하시면.

가장 좋은 방법은 마 젠토를 다운로드 한 다음/lib 디렉토리/Varien을에서 보는 것입니다 수 있도록 라이브러리에 대한 소스 코드를 찾을 수 없습니다/

0

가끔 나에게 거칠고 준비 모음을 제공하기 위해이 정말 간단한 구현을 사용하여 스택. 일반적으로

COL의 주요 요구 사항을 lection이 한 유형의 객체 그룹을 시행하고 있다면 구현하기 위해 생성자로 기본 클래스를 설정하기 만하면됩니다.

class SomeObjectCollection { 

    /** 
    * @var SomeObject[] 
    */ 
    private $collection = array(); 

    /** 
    * @param SomeObject $object1 
    * @param SomeObject $_ [optional] 
    */ 
    function __construct(SomeObject $object1 = null, SomeObject $_ = null) 
    { 
     foreach (func_get_args() as $index => $arg) { 
      if(! $arg instanceof SomeObject) throw new \RuntimeException('All arguments must be of type SomeObject'); 
      $this->collection[] = $arg; 
     } 
    } 

    /** 
    * @return SomeObject[] 
    */ 
    public function getAll() 
    { 
     return $this->collection; 
    } 
} 
관련 문제