私は現在、コアシステムが多くの異なるクライアントに配布されているプロジェクトに取り組んでいます。そして、クライアント要求が変更された場合は、最終的にコアコードはクライアントごとに異なり、最新の状態に保ち、システム全体に新しい機能をコピーすることは困難です。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の偉大な人たちが、メソッドオーバーライドの問題に対処するために役立つ回答や設定を知っているのではないかと心配しました。私は既存のシステムをセットアップしていますスケルトン構造のアイデアは、変更されたものに対して何らかの形の「コントロール」をもたらすために実装しようとしているものです。理想的には、誰かがメソッドなどをオーバーライドしたいときは、コアの中の何も変更されません(少なくとも多くはありません)。
[FuelPHP Framework](http://fuelphp.com/)をダウンロードして、コードを調べて、これらの問題の解決方法を確認することをお勧めします。 – PhearOfRayne
なぜ静的なものを使用していますか? 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 –
@StevenFarleyがリンクを応援します! – Dan