包括几个类在一个

时间:2011-11-18 17:21:48

标签: php oop

我正在研究我的核心课程,如下所示:

require 'core.conf.php';

class Core {
    public function __construct() {
        $autoloader = new classAutoloader();
        $this->instantiateObjects();    
    }

    private function instantiateObjects() {
        $handle = opendir(__DIR__);
        while (false !== ($file = readdir($handle))) {
            if ($file != '.' && $file != '..') {
                if ($file != "core.class.php" && !in_array($file, $file_exceptions)) {
                    $class_name = str_replace('.class.php', '', $file);
                                        $this->$class_name = new $class_name();
                }
            }
        }
        closedir($handle);
    }
}

class classAutoloader extends Core {
    public function __construct() {
        spl_autoload_register(array($this, 'loadClass'));
    }

    private function loadClass($class_name) {
        require $class_name . '.class.php';
    }
}

它加载所有类并将它们实例化为一个核心。 这样我就能做到这一点:

$core = new Core();

并访问所有已加载的类:

$core->database->foo();
$core->template->foo();

现在完全正常,但如果我想使用例如模板类中的数据库我必须为每个需要访问数据库的函数添加全局$ core,但我不想一直都是全局的。解决这个问题的正确方法是什么?如果我把所有类都静态化会有用吗?我更喜欢使用 - >而不是::虽然。我希望你能帮助我!

2 个答案:

答案 0 :(得分:1)

如果您要求CoreClass(数据库,模板)要求拥有Core个实例,则每个CoreClass都会知道Core

如果你告诉任何加载器(你的硬编码自动加载器用于默认库和基于SPL的自动加载器)Core,这些加载器可以将传递给Core实例的类分解为。

class Core
{
    public function addClassInstance($classname, $name)
    {
        $object = new $classname($this);
        $this->$name = $object;
    }
}

abstract class CoreClass
{
    private $core;
    final public function __construct(Core $core)
    {
        $this->_core = $core;
        $this->init();
    }
    final public function getCore()
    {
        return $this->_core;
    }
    abstract public function init();
    final public function __get($name)
    {
        return $this->_core->$name;
    }
}

public function Database extends CoreClass
{
    /* ... */
    public function foo()
    {
        $this->template->foo();
    }
}


$core = new Core;

// load default `CoreClass`'es: template, database
$loader = new CoreDefaultLoader;
$loader->init($core);

$core->database->foo();

CoreClass'将无法使用此设计覆盖__get,因此您可能希望在此处不那么严格,以便继续保持更灵活。

答案 1 :(得分:1)

例如:

# classFunctions.php
class classFunctions {
    private $localCore;
    public function __construct($coreInstance) {
        $this->localCore = $coreInstance;
    }

    public function One () {
        # to use/access core:
        $this->localCore->someFunction();
    }

    public function Two () {
        # to use/access core:
        $this->localCore->someFunction();
    }

    # ...and so on

}

# index.php
# include('classFunctions.php');
$core = new Core(); // Your one and only instantiation of class Core
$clsFunc = new classFunctions($core); // 

这样您就不需要继续使用$GLOBALS