powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Подскажите, как делаются фабрики?
4 сообщений из 4, страница 1 из 1
Подскажите, как делаются фабрики?
    #39867109
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть фабрика с таким кодом:
Код: php
1.
2.
3.
4.
5.
6.
$driver = $dslist[$datasource]['driver'];
$subclass = "DBEngine_${driver}";
$engine = new $subclass($username, $password, $options);
$engine->_datasource($datasource);
$engine->_driver($driver);
return $engine;


В полученном фабрикой классе мне нужно где-то запомнить исходный datasource.
Сейчас я его запоминаю через метод _datasource, который сохраняет в private-переменной полученное значение.
Но поскольку метод является публичный, его могут вызвать повторно и изменить значение.
Можно передавать datasource в конструктор и запоминать его там, но я бы не хотел загромождать его аргументы.
Также можно этот метод вообще убрать, а вместо него в магическом методе __set проверять по debug_backtrace откуда его вызывают и разрешать вызывать только из фабрики. Но как-то это переусложнено.
Еще видел трюки с Closure::bind, позволяющие внедрить метод внутрь класса, но это тоже как-то сложно, плюс требует версию 5.4+.
Может быть есть другой простой способ влезть в private-scope создаваемого класса?
...
Рейтинг: 0 / 0
Подскажите, как делаются фабрики?
    #39867241
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделать метод setDataSource ?
...
Рейтинг: 0 / 0
Подскажите, как делаются фабрики?
    #39867262
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Э...
От того, что я метод _datasource переименую в setDataSource, он станет работать по другому?
Если это будет публичный метод, его сможет вызвать любой.
Если это будет private/protected, то фабрика не сможет его использовать.
...
Рейтинг: 0 / 0
Подскажите, как делаются фабрики?
    #39867268
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сейчас у меня сделано так:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
	final public function __set($name, $value)
	{
		$bt = debug_backtrace(false, 2);
		$src = null; if (count($bt) > 1) $src = "{$bt[1]['class']}{$bt[1]['type']}{$bt[1]['function']}";
		if ($src != 'DBFactory::engine')
		{
			trigger_error("Unknown property '{$name}'", E_USER_NOTICE);
			return;
		}
		$this->store[$name] = $value;
	}



Интересует, можно ли такое поведение получить более прямым способом?
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Подскажите, как делаются фабрики?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]