@zeuss56

Как заставить текущий объект перезаписать самого себя?

Добавил теги Java и C++, т.к. интересно, возможно ли что-то подобное в других ООП-языках.

Такой класс:
<?php
class DB {
	private $link;
	private $config;
	private $charset;

	function __construct($config, $charset) {
		# линки
		$link = &$this->link;
		# сохранение аргументов
		$this->config  = $config;
		$this->charset = $charset;
		# подключение к СУБД
		$link = new mysqli($config['host'], $config['username'], $config['password']);
		# установка БД
		$this->SetDB($config['dbname']);
		# установка кодировки
		$this->SetCharset($charset);
	}

	function SetDB($dbname) {
		# ...
	}

	function SetCharset($charset) {
		# ...
	}

	function Reconnect() {
		# линки
		$config  = &$this->config;
		$charset = &$this->charset;
		# перезапись объекта
		$this = new self($config, $charset);
	}
# ...
}

Вызов Reconnect() должен перезаписывать текущий объект.
$db = new DB($MySQLConfig, $charset);
# ...
$db->Reconnect();

Но вместо этого:
PHP Fatal error:  Cannot re-assign $this in /class/DB.php

Проблему можно решить так: $db = $db->Reconnect();
Но это не лаконично и затрудняет использование метода.

UPD:
Я не уверен, но должно работать так:
function Reconnect() {
	# линки
	$config  = &$this->config;
	$charset = &$this->charset;

	# перезапись объекта
	$this->__construct($config, $charset);
}

Ошибок не вызывает.
  • Вопрос задан
  • 676 просмотров
Решения вопроса 2
@nirvimel
В режиме телепатии догадываюсь, что вы хотите реализовать. Видимо, речь идет о совершенно стандартном механизме порождения объекта соединения из объекта БД.
Чтобы понять как строятся подобные велосипеды загляните в код любой ORM или вообще любой ООП-обертки над драйвером БД. Вы увидите в большинстве случаев следующую картину:
1. Конфигурация БД представляет собой фабрику (да, да, те самые паттерны, которые неофитам НИНУЖНЫ).
2. Метод connect возвращает объект соединение.
3. Объект соединение (кроме методов по выполнению запросов) имеет метод close, который закрывает соединение (попытка выполнения запроса на закрытом соединении будет выдавать ошибку).
4. Соединение (как объект) живет один раз и не может быть переоткрыто после закрытия. Но из фабрики БД всегда можно открыть новое соединение.

Почему так:
Главный принцип ООП: отдельному понятию - отдельный класс. БД (на стороне клиента) представляет собой только конфигурацию: адрес сервера, имя юзера, пароль, имя БД и прочие параметры. Соединение к БД - это отдельная сущность, через которую создаются транзакции и курсоры (отдельные сущности), через которые выполняются запросы. Результат выполнения запроса - отдельная сущность. Отдельная строка в выборке - отдельная сущность (если только не кортеж). И только отдельные поля в строке имеют примитивные типы данных.
Ответ написан
Комментировать
@Snewer
Один экземпляр класса от другого отличается лишь значениями свойств. Вы можете переопределить в методе Reconnect все (часть) свойств.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы