2012-07-18 4 views
1

그래서 내가 붙어있는 두 가지가 있습니다. 먼저적어도 나를 위해 PHP 클래스와 배열 광기

class DisplayTaxonomy { 
public $MyArray[]= new DisplayTaxonomy(); //the compiler says syntax error 
//things I have tried 
//public $ss[]= new Object(); 


} 

두 번째! // 내용 \ 테마 \ twentyeleven \ page.php에 - \ XAMPP \ htdocs를 \ 워드 프레스 \ WP :이 같은 함수에서 :

public function whatever() 
{ 
    $Temp = new DisplayTaxonomy(); 
    $Temp->setADTitle("1"); 
    $MyArray[]= $Temp;//works just fine. 
    //then i tried to return the array 
     return $MyArray[]; 


} 

나는 // C에서 읽기 위해 [] 사용할 수 없습니다 다음 얻을 클라이언트 측

$y=new DisplayTaxonomy(); 
$myArray[]=new DisplayTaxonomy();//works fine dont know why I cant do this in theclass. 
$myArray[]=$y->getArrayOfDisplayTaxonomyObjects(); 
echo $myArray[0]->getADTitle(); 
+0

한 번에 하나의 질문 만하는 것이 좋습니다. 즉이 사이트가 가장 효과적입니다. 그리고 평행으로 두 가지 질문을 할 수 있는지 확인하십시오 (여전히 짝이 필요한 경우). – hakre

+1

지금까지 모든 대답에 대한 일반적인 설명. 생성자에서'new' 문을 사용하는 모든 솔루션은 경보를 발생시켜야합니다! – markus

답변

3

당신이 분류 개체의 컬렉션을 처리하는 클래스를 생성 할 것으로 보인다. 이 경우 클래스를 자체 인스턴스로 저장하는 대신 두 개의 클래스가 있어야합니다.

class TaxonomyContainer 
{ 
    private $collection = array(); 

    public function addElement(DisplayTaxonomy $element) 
    { 
     $this->collection[] = $element; 
    } 

    public function getElements() 
    { 
     return $this->collection; 
    } 
} 

class DisplayTaxonomy 
{ 
    private $adTitle; 

    public function setAdTitle($adTitle) 
    { 
     $this->adTitle = $adTitle; 
    } 

    //and other functionality the Taxonomy object should have 
} 

그런 다음 추악한 자체 복제 동작을 피하고 우려를 분리 할 수 ​​있습니다. 다음 단계에

$container = new TaxonomyContainer(); 
$element = new DisplayTaxonomy(); 
$container->addElement($element); 

, 그것은 컨테이너 클래스에 대한 PHP's predefined interfaces 중 하나의 사용을 고려 가치가있을 수도 있습니다.

+0

두 수업을 끝내게되었습니다. – hidden

2

첫 번째 문제에서 다음 라인 (52) 때문에 당신이 선언하고있는 클래스를 호출하려고하는 것입니다.

class DisplayTaxonomy { 
    public $MyArray[]= new DisplayTaxonomy(); 

클래스를 참조해야하는 코드 부분에서 개체를 클래스 외부에서 초기화해야합니다.

public function whatever(){   
    $Temp = new DisplayTaxonomy(); 
    $Temp->setADTitle("1"); 

    $MyArray[] = $Temp; 

    return $MyArray; 
} 

현재 배열 개체를 선언하고 :

$MyArray[]= $Temp;//works just fine 
+0

하지만 내 클래스의 배열 객체 속성을 선언하는 방법은 무엇입니까? – hidden

+0

내 편집을 참조하십시오. '$ MyArray [] = $ Temp;'에서 이전에'[]'를 사용하면 배열이 초기화됩니다. 배열을 선언하거나 추가 할 때만'[]'를 추가하고 리턴하지 않기를 원할 것입니다. – RobB

2

당신은 객체를 선언을 또한

는 객체는 말 return $MyArray[]를 부착 생략 할 수 있도록 이미 배열입니다 함수 몸체에 넣고 생성자 (또는 멤버 함수)에서 초기화합니다. 배열을 반환 할 때 []을 사용하지 마십시오. $array[]array_push과 동일한 기능을 갖습니다.

명확히하기 위해,

class myClass { 

    public $obj = array(); 

    public function __construct() { 
     $this->obj[] = new OtherObject(); 
    } 

    public function getObj() { 
     return $this->obj; 
    } 
} 
+0

'[] '는'array_push'와 *를 대체하여 *를 초기화합니다. – RobB

+0

좋은 직장. 하지만 obj []를 사용하고 fiskfisk obj를 사용하는 것으로 나타났습니다 – hidden

+0

나는 메모리 누수가 발생했습니다. $ this-> MyArray = new DisplayTaxonomy(); – hidden

0

당신이 호출 할 수있는 코드 (새 DisplayTaxonomy()) 클래스 속성을 definining 때. 당신은 클래스의 생성자에 값을 지정해야합니다 :

class Foo 
{ 
    public $MyArray; 

    public function __construct() 
    { 
     $this->MyArray = new DisplayTaxonomy(); 
    } 
} 

다른 문제는 $ 배열 [] 바로 가기가 배열에 추가하기위한 것입니다. 그냥 배열을 반환하려면 (그리고 당신이 []에 대해 요구하고 배열에 쓰기) 경우, 단순히 [] 생략 :

return $MyArray; 

가 확장 :

빈센트 Joigƞie가 지적 밖으로; 이미 작성중인 클래스와 이름이 같은 클래스를 작성하려고합니다. 이것은 정적 속성을 제외하고는 아무런 의미가 없습니다. 이 경우 당신이) (__construct 사용할 수 없습니다 아니라 만드는 것입니다/당신이 개체를 처음 검색 할 호출하고있는 정적 메서드에 개체 설정 :

static public function getInstance() 
{ 
    if (self::$MyArray === null) 
    { 
     self::$MyArray = new DisplayTaxonomy(); 
    } 

    return self::$MyArray; 
} 

이것은 당신이 무엇을 그러나 아마 아니다 원한다면 클래스 정의에서 논리에 뭔가 혼란 스러울 것 같습니다. 자유롭게 추측 그냥 할 수 있습니다 :

배열로
class Foo 
{ 
    public $MyArray = array(); 
} 

()는 정적 할당 (그리고 함수 호출), 그것은이 클래스 정의에 사용할 수 있습니다.이 무한 루프처럼 때문에

class DisplayTaxonomy { 
    public $MyArray[]= new DisplayTaxonomy(); 
} 

을 : 그래서 당신은() 함수를 __contruct 사용할 수 있습니다

+0

좋은 직장. 나는 물건이 생성자를 통해 초기화되어야한다고 생각하지 않는다. – hidden

+0

예 메모리 누수는 정적이 아니기 때문에 발생합니다. – hidden

+0

좋은 해결책은 아닙니다. '정적'은 나쁘고 자체 복제 객체도 나쁘다. – markus

2

당신은이 작업을 수행 할 수 없습니다.

return $MyArray[]; 

에 : 변경 후

return $MyArray; 
+0

무한 루프와 같지 않기 때문에 (어쨌든'__construct()'함수를 사용하는 것이 아니라) 상수가 아니기 때문입니다. 오직 상수 만이 반원들의 초기 값을 위해 일한다. – hakre

+0

예,하지만 우리는 클래스 var에 영향을 줄 수 없습니다. 이런 종류의 문제를 피하십시오. – PoulsQ

+0

예 constructor 또는 no constructor는 무한 루프입니다. H – hidden