В некотором отношении у меня работает следующее: я могу получить доступ к smarty с помощью $ db-> tpl в моих скриптах.
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 Formatting {
public $fmt;
public function __construct() {
$this->fmt = new Formatting_Database;
}
Кто-нибудь может указать, что мне нужно изменить, чтобы получить доступ к классу форматирования из объекта $ db.
Одно слово: рекурсия.
Что предположительно происходит:
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;
Поэтому я думаю, что вам нужно немного переосмыслить свой дизайн, точное решение будет зависеть от того, что должно произойти, очевидно!
Просто еще одна дополнительная заметка … вы можете захотеть взглянуть на требование vs include vs include_once vs require_once, если мои знания не устарели, это будет иметь значение при включении файлов (include_once не будет повторно импортировать второй раз) — снова , зависит от того, как все скреплено, но стоит проверить.
Других решений пока нет …