2011-10-20 2 views
0

나는 이것이 가능하다고 생각하지 않으며 Google 검색에서 어떤 결과도 얻지 못했지만 결코 물어 보지 않을 것이라고 생각했습니다.PHP의 생성자 매개 변수를 기반으로 한 다른 객체 정의가 있습니까?

PHP 라이브러리를 통해 내 사이트에 Google Chart를 구현하려고합니다. 내가 정말 좋아하는 (googlechartphplib) 라이브러리는 모든 차트 유형에 대해 약 10 개의 서로 다른 클래스 파일을 가지고 있습니다. 즉, 원형 차트를 만들려면 $chart = new GooglePieChart();을 사용해야하지만 QR 코드를 만들려면 $chart = new GoogleQRCode(); 등을 사용해야합니다.

실제로 API를 사용할 때 차트의 유형이 전달 된 것으로 나타났습니다. 생성자에 저장됩니다 (나중에 저장되고 쿼리 문자열의 일부로 API에 전달됨). 왜 그냥 읽을 수 없습니다 : 예를 들어, 코드는

이 생각 날 잡았어 (lc는 "라인 차트", 500 및 200는 차원이다를 정의하는 경우) $chart = new GoogleChart('lc', 500, 200);의, 선 그래프는 단지 $chart = new GoogleChart(); 아닌지 확인하기 이 첫 번째 매개 변수는 만들 차트 유형을 결정하는 데 사용됩니까? 하나의 범용 생성자가 있어야합니다.

$piechart = new GoogleChart('pie'); 
$linechart = new GoogleChart('lc'); 
$qrcode = new GoogleChart('qr'); 
... 

나는 모든 함수 호출에서 switch/case 문을 사용하여이를 수행 할 수있는 방법을 생각할 수 있습니다. 예를 들어 :

public function computeQuery() { 
    switch($this->type) { 
     case 'qr': 
      /* QR code function */ 
      break; 
     case 'pie': 
      /* Pie chart function */ 
      break; 
     case 'lc': 
     default: 
      /* line chart code */ 
      break; 
    } 

그러나이 재 작성 이미 존재하는 모든 코드 (복사/내 능력에 의해 약간 신속한 코드의 90 %를 붙여) 포함됩니다. 결과 객체가 생성자 매개 변수를 기반으로해야하는 클래스를 간단히 선택하는 방법이 있습니까? 예 :

public function __construct($type, $x, $y) { 
    $this->type = $type; 
    switch($type) { 
     case 'qr': 
      return new GoogleQRCode($x, $y); 
     case 'pie': 
      return new GooglePieChart($x, $y); 
     case 'lc': 
     default: 
      $this->width = $x; 
      $this->height = $y; 
    } 
} 

답변

5

생성자에는 없습니다.

그 이유는 Factories이 존재하기 때문입니다.

+0

화려한 외모. 다른 아이디어가 있는지 잠시 기다려 볼 것이지만, 나는 이것을 할 것입니다. 그러나 이것은 새로운 문제를 제기합니다. 공장에서 필요로 할 때만 특정 수업을 포함시키는 좋은 방법이 있습니까? 일반적으로 하나만 사용한다면 10 개의 클래스 정의를 포함하는 낭비 된 메모리처럼 보입니다. – stevendesu

+1

자동로드 찾아보기 : http://php.net/manual/en/language.oop5.autoload.php –

+0

니스. 완벽하게 작동합니다. 기회를 놓치지 않고 기다리는 사람은 더 마법 같은 해결책을 가지고 있지만 그렇지 않으면 완벽하게 작동합니다. – stevendesu

관련 문제