2010-12-13 6 views
2

私はこのコードを勉強しています:それは http://www.w3style.co.uk/a-lightweight-and-flexible-front-controller-for-php-5クラスをインスタンス化する通常のコンストラクタではなく、 `public static function createInstance()`をいつ使うべきですか?

著者は、クラスをインスタンス化するstatic機能を使用しています。私は基本的に初心者で、これは見たことがありませんでした。通常のコンストラクタではなくstaticインスタンシエータを使用するのはなぜですか?
index.phpの

<?php 
define("PAGE_DIR", dirname(__FILE__) . "/pages"); 
require_once "FrontController.php"; 
FrontController::createInstance()->dispatch(); 

FrontController.php

<?php 
class FrontController { 
    public static function createInstance() { 
    if (!defined("PAGE_DIR")) { 
     exit("Critical error: Cannot proceed without PAGE_DIR."); 
    } 
    $instance = new self(); 
    return $instance; 
    } 
    public function dispatch() {....} 

答えて

6

それはこのようなものはあまりにも馬鹿であるので、これは、PHPのための回避策です:

ここ

コードです

(new SomeClass())->doSomething(); 

ネイティブPHPでは、そうしたオンエラーは不可能です。一部の人々はそれを可能にするために静的メソッドでは、クラスのインスタンス化をラップ理由です:

SomeClass::create()->doSomething(); 

あなたは余分な変数を必要としないので、それは、きれいな範囲を維持するのに役立ちます。それはそうでない場合は、次のようになります。

$instance = new SomeClass(); 
$instance->doSomething(); 
unset($instance); 

EDITを:私は(コメントから)ここでゴードンの言葉を引用しましょう:。「静的呼び出しがグローバルスコープに関数を置くことと同じであることを呼び出します常にグローバルスコープに依存している」と語った。あなたのコードの柔軟性を損なうので、この事実に注意する必要があります。

+0

これはシングルトンパターンを実装するために行われました。このようなスタティッククリエータを使用する他の理由はありませんか? – JDelage

+0

createInstance()はpublicであり、privateではないので保護されていないので、これは実際にはシングルトンパターンではありません。このメソッドはコンストラクタでもありません。 – vladv

+0

@JDelage、@vladv:申し訳ありませんが、私はそれを誤解しました。私は答えを決めた。 – jwueller

2

最も一般的な状況は、シングルトンインスタンスを作成するか、ファクトリパターンを使用する場合です。

+0

問題は、これがシングルトンインスタンスを作成しないということです。私は私の答えで同じ誤りを犯しました。 – jwueller

+0

@elusive - これはOPのオリジナルの質問に対する答えです。「通常のコンストラクタではなく静的インスタンス化を使用する理由は何ですか?ポストに示されているコードでは感覚的なデザインパターンは実装されていませんが、2行のコードを1行に減らすためのダンバスメソッドを使用しているという事実は、元のコードの作者にはひどく反映されています。 –

+0

私は全く同意します。私はOP(明らかに)が彼の質問を更新したことを指摘したがっている。 – jwueller

1

PHPは一つのコンストラクタのみを許可します。つまり、複数の方法でオブジェクトを構築したい場合は、複数の静的関数を有効な解決策とみなします。しかし、コンストラクタを呼び出す静的関数を持つだけではあまり意味がないようです。

たとえば、オブジェクトの各プロパティのパラメータを取得するコンストラクタを使用できます。静的関数はIDだけを受け取り、オブジェクトを取得するためにすべてのプロパティを取得するデータベース呼び出しを行います。これは、呼び出しコードにすべてのデータベースプロシージャを持つ必要はないということです。静的関数は責任を負います。

これを行うには、別のFactoryクラスを作成することがよくありますが、それは常に意味をなさないと思います。あなたが理にかなっている場合は、決定を下す前にその件名を読んでください。

関連する問題