2011-10-20 4 views
0

私はこれが可能であるとは考えていません.Googleで検索しても結果は得られませんでしたが、尋ねることは決してないと思いました。PHPのコンストラクタパラメータに基づくオブジェクト定義が異なりますか?

私は自分のサイトにPHPライブラリを使ってGoogle Chartを実装しようとしています。私が本当に好きな図書館(googlechartphplib)には、あらゆる種類の図表について約10種類のクラスファイルがあります。つまり、円グラフを作成するにはQRコードを作成する必要がありますが、QRコードを作成するには$chart = new GoogleQRCode();などを使用する必要があります。

実際にAPIを使用したとき、コンストラクタに渡されます(保存され、後でクエリ文字列の一部としてAPIに渡されます)。なぜ私は読むことができません:たとえば、折れ線グラフを作成するためのコードがちょうど$chart = new GoogleChart();ではない、それは$chart = new GoogleChart('lc', 500, 200);lcは「折れ線グラフ」を定義する場合は、500と200は寸法です)

これは私が考えるようになったのですどのタイプのチャートを作成するかを決定するこの最初のパラメータ?

$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が存在する理由の1つです。

+0

鮮やかに見えます。誰かが他のアイデアを持っているかどうかを私はしばらく待つだろうが、私はこれをやっているかもしれない。しかし、これは新しい問題を課す。工場がそれを必要とするときに特定のクラスだけを含めることは良い方法ですか?私は通常1つだけを使用している場合は、10種類のクラス定義を含めるために無駄なメモリのように思えます。 – stevendesu

+1

自動読み込みを参照する:http://php.net/manual/en/language.oop5.autoload.php –

+0

ニース。完璧に動作します。オフチャンスで待つつもりだが、誰かがより魔法の解決策を持っているが、そうでなければ完全に機能する。 – stevendesu

関連する問題