多个 类 如何最好地进行

Multiple classes how best to proceed

我在某些方面有以下工作,我可以在我的脚本中使用 $db->tpl 访问 smarty。

init.php 包含在每个文件的顶部

spl_autoload_register(function ($class) {
    include 'inc/classes/' . $class . '.class.php';
});

class Database_Smarty extends Smarty {

    function __construct() {

        parent::__construct();

        $this->setTemplateDir('templates'); // etc etc

    }

}

class Filter_Database extends Database {

    function __construct() {

        parent::__construct();
    }

}

class Formatting_Database extends Database {

    function __construct() {

        parent::__construct();
    }

}

class Hashing_Database extends Database {

    function __construct() {

        parent::__construct();
    }

}

Database.class.php 这很好用,我可以从我的数据库对象访问 smarty。当我尝试添加 Formatting_Database 或以下任何扩展到构造中时,我的问题就来了。

class Database {

    // vars instantiated
    public $tpl;
    public $fmt;

    public function __construct() {
        # Connection here works

        $this->tpl = new Database_Smarty;

        // Example i cant do this it crashed php leading to no data
        // sent notice in the browser.
        $this->fmt = new Formatting_Database;

    }
}

Formatting.class.php 其余 class 文件遵循相同的格式。

class Formatting {

    public $fmt;

    public function __construct() {

        $this->fmt = new Formatting_Database;
    }

任何人都可以指出我需要更改什么才能从 $db 对象访问格式 class。

一个字:递归

可能发生的情况是:

new Database;
[calls __construct on Database]
    [calls __construct on Formatting_Database]
        [calls __construct on parent (Database)]
             [calls __construct on Formatting_Database]
                 [calls __construct on parent (Database)] 
                     [calls __construct on Formatting_Database]
                         [calls __construct on parent (Database)]
(for ever and ever and ever)

我不确定为什么 PHP 在这种情况下没有报告堆栈溢出,但这大概是它的方向。

尝试删除此处的行并观察行为:

// Example i cant do this it crashed php leading to no data
// sent notice in the browser.
$this->fmt = new Formatting_Database;

所以我认为你需要重新考虑一下你的设计,精确的解决方案显然取决于具体需要发生什么!

只是最后的额外说明...您可能想看看 require vs include vs include_once vs require_once,除非我的知识已经过时,否则这在包含文件时会有所不同(include_once 不会重新导入第二次)——同样,这取决于所有东西是如何连接在一起的,但值得检查。