我最近开始以面向对象的方式在 php5 中进行开发,但我遇到了一些问题。我非常感谢您的帮助/建议。
忍受我,因为它最终一团糟:-(
这是我的场景(希望我能详细说明):我有两个动态类,Client 和 Supplier,它们使用名为 Vocabulary 的静态类的方法。Vocabulary 是一个从源中提取词汇术语的类,该源可以是:纯文本文件、mongodb 数据库或 mysql 数据库。配置文件中的一个条目决定了应用程序将使用上述三种来源中的哪一种。
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 将覆盖其父 useVocab(),因为它需要执行额外的操作来设置 $_SESSION 变量,但 Vocabulary_mongodb 和 Vocabulary_mysql 不需要覆盖它们的 useVocab() 父方法(它们只需要设置 $_SESSION 变量)。所有三个词汇“子”类都将覆盖 getTerm() 方法。
以下是我尝试过的,这是我最终得到的一团糟:-(
- 对于 Vocabulary_mongodb 和 Vocabulary_mysql,由于 useVocab() 不存在而是从 Vocabulary 继承,“method_exists()”返回 true,并且该调用导致无限循环。
- 我在 Vocabulary 中显式调用 child 和在 child 类中调用 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
}
}
我想知道如何设计 Vocabulary 类以保持 Vocabulary::... 像 Client 和 Supplier 中的调用,并让 Vocabulary 知道哪个子类用于“Config”类中配置的类型。
任何建议将不胜感激。干杯