私は最近、オブジェクト指向の方法でphp5で開発を始めましたが、何かに行き詰まっています。私は本当にあなたの助け/推薦に感謝します。
それが混乱に終わったので、これで私と一緒に耐えてください:-(
これが私のシナリオです(これについて明確に説明できることを願っています):Vocabularyと呼ばれる静的クラスのメソッドを使用するClientとSupplierの2つの動的クラスがあります。語彙は、プレーンテキストファイル、mongodbデータベース、またはmysqlデータベースなどのソースから語彙用語を取得するクラスです。構成ファイルのエントリは、アプリケーションが前述の3つのタイプのソースのどれを使用するかを決定します。
class Client {
public function foo() {
...
Vocabulary::getTerm();
...
}
...
}
class Supplier {
public function bar() {
...
Vocabulary::getTerm();
...
}
...
}
class Vocabulary {
public static function useVocab($vocab) {
$_SESSION['vocab'] = $vocab;
}
public static function getTerm($termKey) {...}
...
}
サポートしたいタイプごとにVocabulary子クラスを作成することを計画しました。たとえば、Vocabulary_file、Vocabulary_mongodb、Vocabulary_mysqlなどです。Vocabulary_fileは、$ _ SESSION変数の設定から追加の操作appartを実行する必要があるため、親のuseVocab()をオーバーライドしますが、Vocabulary_mongodbとVocabulary_mysqlは、useVocab()の親メソッドをオーバーライドする必要はありません($ _SESSION変数セットが必要です)。3つの語彙の「子」クラスはすべてgetTerm()メソッドをオーバーライドします。
以下は私が試したものであり、これは私が最終的に得た混乱です:-(
- Vocabulary_mongodbおよびVocabulary_mysqlの場合、useVocab()は存在しないが、Vocabularyから継承されているため、「method_exists()」はtrueを返し、その呼び出しによって無限ループが発生します。
- Vocabularyで子を明示的に呼び出すことと、子クラスでparent::を呼び出すことの両方が奇妙に見えます。
たくさんのコーヒーを飲んだ後、私はすべての知恵を使い果たし、私の脳は損傷を受けました。
// Class Vocabulary modified to make it call the desired "child" class too
class Vocabulary {
// This would execute "child" class method
private static function _callChild($method, $args) {
$child_class = 'Vocabulary_' . Config::$vocab['type']; // Config::$vocab['type'] can be: file, mongodb or mysql
if (method_exists($child_class, $method)) {
return call_user_func_array($child_class . '::' . $method, $args);
} else {
return false;
}
}
public static function useVocab($vocab) {
$_SESSION['vocab'] = $vocab;
self::_callChild(__FUNCTION__, compact('vocab'));
}
public static function getTerm($termKey) {
$termKey = strtolower($termKey);
self::_callChild(__FUNCTION__, compact('termKey'));
}
...
}
class Vocabulary_file extends Vocabulary {
public static function useVocab($vocab) {
parent::useVocab($vocab);
// some specific stuff here
}
public static function getTerm($termKey) {
parent::getTerm($termKey);
// some specific stuff here
}
}
class Vocabulary_mongodb extends Vocabulary {
public static function getTerm($termKey) {
parent::getTerm($termKey);
// some specific stuff here
}
}
class Vocabulary_mysql extends Vocabulary {
public static function getTerm($termKey) {
parent::getTerm($termKey);
// some specific stuff here
}
}
ClientやSupplierでの呼び出しのように、Vocabulary :: ...を維持するために、Vocabularyクラスを設計する方法を知りたいのですが、Vocabularyに「Config」クラスで構成されたタイプに使用する子クラスを知らせます。
アドバイスをいただければ幸いです。乾杯