我有几个关于PHP类的问题,但他们不能单独询问,所以我来到这里:一些(高级)问题
我有我建设,并在核心CMS它有我的baseClass,记录器,DB和模块类。 DB和记录器是静态类,所以我可以在其他对象中使用它们。有很多被加载到基类与模块类:
class baseClass {
private $_modules;
public function __construct() {
logger::log("instance created.");
$this->_modules = Array()
}
public function __destruct() {
foreach($this->_modules as $name) $this->unloadModule($name);
logger::log("instance destroyed.");
}
public function loadModule($name) {
if (class_exists($name)) {
if (!isset($this->$name)) {
$this->_modules[] = $name;
$this->$name = new $name();
logger::log("module '$name' loaded.");
}
else logger::log("module '$name' already loaded.", 2);
}
else logger::log("module '$name' does not exist.", 3);
}
public function unloadModule($name) {
if (isset($this->$name)) {
unset($this->$name);
foreach($this->_modules as $id => $mod_name) {
if ($name==$mod_name) {
unset($this->_modules[$id]);
logger::log("module '$name' unloaded.");
}
}
}
else logger::log("module '$name' not loaded.", 2);
}
public function listModules() {
return $this->_modules;
}
}
$instance = new baseClass();
$instance->loadModule('moduleX');
$instance->loadModule('moduleY');
问题1:是我的加载模块的实现是一个好主意,或者你有更好的解决方案。或者是有可能扩展类的其他方式,所以我也不会加载模块,而不是他们的类定义将自己加载到像基类:
class moduleX reverseExtends baseClass {
public function f1();
public function f2();
}
class moduleY reverseExtends baseClass {
public function f3();
public function f4();
}
$instance = new baseClass();
$instance->f1();
$instance->f2();
$instance->f3();
$instance->f4();
或至少:
$instance->moduleX->f1();
$instance->moduleX->f2();
$instance->moduleY->f3();
$instance->moduleY->f4();
问题2:现在我用我的记录和DB类作为静态类(我称他们与记录::和DB::)所以他们在任何情况下和范围访问 - 这可能实例他们仍然在我的baseClass对象中使用它们,但没有在baseClass中实例化它们或者像这样设置它们每一类中,我要与使用它:
public function __construct() {
global $logger_instance;
$this->logger = $logger_instance;
}
我已经尝试了不同的方法,从坏的传递基类中的原始对象的引用丑陋使用包装函数。当baseClass未设置并且很难通过模块访问时,使用引用会破坏我的记录器对象 - $ this-> base-> logger-> log() - 这需要引用baseClass对象($ this-> base)和杀死我的baseClass对象在unloadModule上......至于包装函数 - 我希望能够拥有多个logger对象实例,所以传递一个实例标识符和函数一起使它变得非常丑陋和“不真实”的解决方案。
我需要这样的东西:
public function someFuncionInsideSomeClass() {
$logger->('Log something'); //or $logger('Log something') with __invoke()
//$logger here is in the global scope
}
问题3:我想一个模块能够修改一个又一个的代码。例如,我有一个数据库模块加载,然后我加载一个记录模块,并希望记录模块集成到数据库模块代码中,而不必弄乱它的原始代码。当然,记录器将不得不照顾整合本身(或者更确切地说我是编码器)。简单的例子:
class tagCreator {
public function createTag($tag,$data) {
$tag1 = $tag;
$tag2 = '/'.$tag;
return "<$tag1>$data<$tag2>";
}
}
class styleFunctionality {
public function __construct() {
//if class is loaded (tagCreator) | load class (tagCreator)
//do some magic here to tagCreator
//tagCreator -> createTag -> add argument $style
//tagCreator -> createTag -> $tag1 += ' style="'.$style.'"'
//else issue error tagCreator does not exist
}
}
$instance = new baseClass();
$instance->loadModule('tagCreator');
echo $instance->createTag('span','some string');
// returns <span>some string</span>
$instance->loadModule('styleFunctionality');
echo $instance->createTag('span','some string','font-weight: bold');
// returns <span style="font-weight: bold">some string</span>
注:我并不一定意味着函数重载,我可能要换一种方法里面只有一点点的代码
注2:调用$实例 - > createTag( )是不是一个错误 - 我打算写一些花哨 __ ()函数调用基类为挑选其加载的模块远远阅读本方法
很抱歉的长期话题,谢谢,我会连的欣赏e只回答我的一个问题:)
Q1 - 您可以使用自动加载按需加载您的类,因此您的第二种调用方法可能是'$ instance-> moduleY-> f4();'。 Q2 - 我认为静态方法将是去那里的方法。 – JohnP 2011-04-13 17:37:20
我想到了这一点,但有时我可能会声明所有模块,但我不希望它们都加载到我的baseClass中。 – 2011-04-13 17:42:38
我回答了更多细节。你不应该加载到你的基类 – JohnP 2011-04-13 17:55:32