Несколько классов, как лучше поступить

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]