2012-12-20 12 views
10

私は現在、コアシステムが多くの異なるクライアントに配布されているプロジェクトに取り組んでいます。そして、クライアント要求が変更された場合は、最終的にコアコードはクライアントごとに異なり、最新の状態に保ち、システム全体に新しい機能をコピーすることは困難です。PHPのクラスとメソッドのオーバーライド - コールバックの実装

私は、(私が呼んでいる)コードの外側のスケルトン構造を持つ「オーバーライドモデル」に移行することを提案しました。ややのような:

|- controllers 
|- models 
|- views 
|- core 
    |- controllers 
     |- Controller1.php 
    |- models 
    |- views 

あなたがController1.phpに変更を加えたい場合、あなたは外の構造にそれをコピーして、変更になるだろう - 彼らはスケルトン構造をチェックすることによって、存在する場合、オートローダは適切なファイルをロードしますそのすべてが順調と変更が必要な場合はコントローラをオーバーライド良いが、その後、任意の将来のコアの追加や修正はないかもしれない - 彼らのために少しさらにそれよりも行くことが可能である場合は、最初の、すなわち

Loader::controller('Controller1'); 

は、しかし、私は疑問に思いましたあなたがファイルのコピーを作成して単なるメソッド呼び出しをオーバーライドする可能性があると思いました。次のように私が何を意味するかの半例は次のとおりです。

class Override { 

public function __call($method, $args) { 
    return call_user_func_array(array('Something', $method), $args); 
} 

public static function __callStatic($method, $args){ 
    return call_user_func_array(array('Something', $method), $args); 
    } 

} 

// Core class 
class Something { 

    static function doTest() { 
     echo "Class something <br/>"; 
    } 

    static function doOtherTest() { 
     echo "That works <br/>"; 
     self::doTest(); 
    } 

} 


// Overriding class - named differently for ease of example and reasons explained later 
class SomethingElse extends Override { 

    private static function doTest() { 
     echo "Success <br/>"; 
    } 

} 

// Actual function calling 
SomethingElse::doTest(); 
SomethingElse::doOtherTest(); 

ている一般的なアイデアの方法がここにハードコードされた「親」クラスからアクションを(そして、元のクラスに存在しない場合に)。

  • は私が
  • 私は親クラスがその後呼び出すメソッドをオーバーライドしようとしていた場合、それが使用するクラスが同じ名前を持っているとき、私はトラブルに遭遇すると思います。しかし、私はこの方法では二つの問題を持っていますそれは私がオーバーライドしようとしているものとは対照的に、メソッドの独自のバージョンです
    • 「単純な」解決法は、関連しているメソッドをオーバーライドする必要がありますが、後で追加する可能性があります。

現在、私だけで動作し、それほど複雑ではローダーを使用してオーバーライドする完全なクラスの初期解をやろうとしています。

しかし、StackOverflowの偉大な人たちが、メソッドオーバーライドの問題に対処するために役立つ回答や設定を知っているのではないかと心配しました。私は既存のシステムをセットアップしていますスケルトン構造のアイデアは、変更されたものに対して何らかの形の「コントロール」をもたらすために実装しようとしているものです。理想的には、誰かがメソッドなどをオーバーライドしたいときは、コアの中の何も変更されません(少なくとも多くはありません)。

+1

[FuelPHP Framework](http://fuelphp.com/)をダウンロードして、コードを調べて、これらの問題の解決方法を確認することをお勧めします。 – PhearOfRayne

+0

なぜ静的なものを使用していますか? MVC全体が再利用可能/交換可能なコンポーネントを持っています。統計は緊密にすべてを結合する。これはデザインの観点からは非常に悪いことです。参照:http://misko.hevery.com/2008/12/15/static-methods-are-death-to-testability/およびhttp://stackoverflow.com/questions/9560484/static-methods-or-not/11933130#11933130 –

+0

@StevenFarleyがリンクを応援します! – Dan

答えて

1

厳密なオブジェクト指向のソリューションは、いくつかの異なる現実的なアプローチによって実装可能であり、次に継承原理を超えて構成された抽象的なインタフェースとしてコントローラを広めることになります。

ここでは、上書きまたは拡張する既存のコードがあることを理解しています。あなたのPHP-バージョンは、あなたが上の特徴を使用することを許可している場合、これはあまりにもあなたを助けるかもしれない:

PHP 5.4: why can classes override trait methods with a different signature?

+0

SVBokenhamはこれをどのように行うのか記述しましたが、これを正しい答えとしてマークします何が私たちを解決に導いたのか? – Dan

3

は、まあ、我々はそれを解決してきました。それは特色です!

しかし、バージョン管理されたコードを特質に変換して、上記の構造のバージョン管理されていないファイルで呼び出すことが重要です。これにより、ローダークラスやその他のクラッシュ防止レイヤーが不要になり、クライアントごとにカスタムコードに影響を与えずに、コアコードを更新、テスト、およびコミットできます。

+3

これは私がTraitsを使って見た最初の現実的で非馬鹿な理由です。 –

関連する問題