2015-03-24 3 views
0

У меня есть следующие работы в некотором отношении, я могу получить доступ к 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.

ответ

0

Одно слово: рекурсия.

Что предположительно происходит это:

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 не будет повторно импортировать второй раз) - опять же, зависит от того, как все болтается вместе, но стоит проверить.

+0

Извините, пропущено. Добавление этой строки (я только добавил ее снова, чтобы показать, что я уже пробовал) вызывает сбой. По сути, имейте в виду, что мы в конечном итоге должны иметь все мои объекты $ db и $ db-> tpl напрямую через фильтр или формат по мере необходимости, в зависимости от того, где это происходит. поэтому данные пользователя будут отфильтрованы для базы данных и данных, когда они будут отброшены, отфильтрованы и отформатированы для вывода браузера. Я просто ввязываюсь в беспорядок с заказами классов, которые я думаю. – Chris

+1

@Chris Я думаю, что для этого потребуется немного больше, чем комментарий, чтобы предложить решение проблемы дизайна. Взгляните на: http://www.oodesign.com, это хороший ресурс по некоторым шаблонам, которые вы могли бы использовать. Для меня это будет ручка + бумага (+ чай и бисквит)! – button

+0

Ive вернулось к чертежной доске, я, наконец, сумел рекурсивно добавить каждый класс, но он кажется громоздким и в долгосрочной перспективе проблематичным для рефакторинга, если это необходимо, поэтому я посмотрю на предложенную ссылку и сделаю хорошие заметки :), Спасибо за вашу помощь. – Chris

Смежные вопросы