Перегрузка свойств класса PHP5 с контейнером зависимостей

———————-ОБНОВИТЬ————————————————- —

Я не очень хорошо объяснил, чего я в конечном итоге пытаюсь достичь с помощью этой перегрузки. Я просто хочу использовать объект config для хранения всего и иметь только один экземпляр, порожденный базой данных, также в config. Затем, когда я загружаю страницу, я хочу загрузить такие вещи, как данные сеанса, данные пользователя, состояние приложения, различные идентификаторы и т. Д. И т. Д., Просто добавив массив в объект конфигурации, например:

$userSession['ctime'] = time();
$userSession['key'] = rndkey(32);
etc... etc...

Затем используйте объект конфигурации, как …

$_config = new configObject();
$_config->__set('SESSION', $userSession);
etc.. etc...

Надеюсь, это поможет мне понять, что я пытаюсь понять.

———————-КОНЕЦ ОБНОВЛЕНИЯ ——————————————

Могу ли я перегрузить свойство статической конфигурации контейнеров зависимостей? Я хочу настроить свой код так, чтобы объект устанавливал динамические значения конфигурации, но я не хочу тратить все время на его изменение, если оно не будет работать. Я прочитал что-то о вас не может __set () по ссылке, и не уверен, как это относится к статическому свойству.

Пример … (Эти классы явно урезаны и упрощены)

class depCon {

public static $_database;
public static $_config;

//Database Dependencies
public static function createDatabaseObject() {

$db = new mysqliObject();
$db->setConfig(self::$_config);
$db->connect();

return $db;
}
}class configObject {

public $overload = array();

public function __construct() {

//set some default values

$this->__set('DBHOST', 'localhost');
$this->__set('DBUSER', 'xxxxxxxxxxx');
$this->__set('DBNAME', 'xxxxxxxxxxx');
$this->__set('DBPASS', 'xxxxxxxxxxx');
}

public function __get($item) {
return array_key_exists($item, $this->overload) ?
$this->overload[$item] : false;
}

public function __set($item, $value) {
$this->overload[$item] = $value;
}

}

class mysqliObject {

public $user = "";
public $pass = "";
public $name = "";
public $host = "";

public $_db;
public $_config;public function __construct() {
}

public function __destruct() {

$this->close();
}

public function connect() {

$this->host = $this->_config->get('DBHOST');
$this->name = $this->_config->get('DBNAME');
$this->user = $this->_config->get('DBUSER');
$this->pass = $this->_config->get('DBPASS');
$this->MYSQLI_LINK = new mysqli($this->host, $this->user, $this->pass, $this->name);
}

public function setDatabase($databaseConnection) {

$this->_db = $databaseConnection;
}

public function setConfig($config) {

$this->_config = $config;
}

public function close() {

@mysqli_close($this->MYSQLI_LINK);
}
}

Использование:

$_config = new configObject();
depCon::$_config = $_config;
$dbi = depCon::createDatabaseObject();
depCon::$_database = $dbi;

Таким образом, вопрос заключается в том, если я настрою это так и попытаюсь перегрузить $ _config, например …

$_config->__set('NEWDYNAMICITEM', 'SomeDynamicData');

а также

$_config->__get('NEWDYNAMICITEM');

У меня возникнет проблема, потому что я обращаюсь к объекту $ _config по ссылке из-за контейнера зависимостей?

Должен ли я просто покончить с контейнером зависимостей все вместе и просто сделать так, чтобы класс DB расширял класс config?

Или, может быть, наоборот?

Любая помощь / совет по этому вопросу будет принята с благодарностью, я пытаюсь настроить пользовательскую среду PHP и хочу все сделать правильно.

Спасибо!

1

Решение

То, как вы делаете это, сбивает с толку.

Что работает лучше всего, это инъекция. Другими словами, я бы полностью пропустил перегрузку и определил класс вашей базы данных. вне другие ваши классы, а затем внедрить их в ваш конструктор. Таким образом, вы определяете соединение с базой данных только один раз и экономите накладные расходы

$db = new mysqliObject();
$db->setConfig(depCon::$_config);
$db->connect();
$objct = new exampleObject($db);
1

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

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

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