как передать объект класса в другой класс?

Духовность™

Продвинутый новичок
как передать объект класса в другой класс?

Есть singleton, который возвращает объект класса БД.

Есть класс user которому необходимо передать объект класса БД.

Как лучше делать - передавать при инициализации класса объект:

PHP:
$main = Main::getInstance();

$db = $main->getDbObject();

$user = new user($db);
или вызвать

PHP:
$main = Main::getInstance();
в конструкторе класса user?
 

tashkentchi

Новичок
ну и што?

Main ведь singleton? А user все равно "завязан" на Main, т.е. на синглетон.
 

tashkentchi

Новичок
Нафиг тогда вообще нужен singleton, если не хочеш пользовать Main::getInstance() и передаешь везде ссылку на объект базы.
 

tashkentchi

Новичок
Синглетон "гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа".

Вот и пользуй эту глобальную точку доступа.
 

Gas

может по одной?
tashkentchi
singleton никак не обязывает как передавать объект, параметром в метод или прямо в нём получать ссылку на него.
 

tashkentchi

Новичок
Согласен. - Не обязывает.

Но предоставляет удобную возможность. А речь ведь идет о том как лучше.

Лично мне более удобен второй способ. Так как при последующей работе с классом user, не придется вспоминать про базу.
 

Gas

может по одной?
tashkentchi
А речь ведь идет о том как лучше
я, например, не уверен что лучше - действительно user завязывается на статическое имя registry-класса или его метода (getDbObject), но и не утверждаю обратное :)
Самому интересно, я по ситуации то так, то эдак делаю - хотя пытаюсь без необходимости зависимостей не создавать, но не всегда получается :)

А нах** маин синлетон
наверное реализация похожая на эту
 

Gas

может по одной?
ну 1-ый вариант, класс user не завязан на Main.
Но тут лучше подождать что скажут завсегдатаи oop топиков.
И кстати уже ж была недавно тема по поводу связывания кода, кажется там все остались при своём мнении.
 

Alexandre

PHPПенсионер
$main = Main::getInstance();
$db = $main->getDbObject();
$user = new user($db);
я бы сделал так:
PHP:
$main = new Main();
$main->init();
$main->run();
....

class Main {
...
function init(){
...
$db = Db::getInstance();
$db->Open(....);
...
}
function run(){
...
$user = new User();
....
}

}

class User {
...
function foo(){
...
$db = Db::getInstance();
...
}
}
 

whirlwind

TDD infected, paranoid
Согласен. - Не обязывает.

Но предоставляет удобную возможность. А речь ведь идет о том как лучше.

Лично мне более удобен второй способ. Так как при последующей работе с классом user, не придется вспоминать про базу.
Проблема инициализации решается гораздо проще без образования зависимостей. Используйте фабрику для инициализации однотипных объектов. Фабрика настраивается один раз. Реализацию фабрики можно подменить.

PHP:
// выбрать что больше подходит/нравится
$user = $factory->createUser();
// или 
$user = $factory->create('User');
Использовать фабрики имеет смысл всегда, когда инициализация подразумевает связи с конкретными реализациями. В этому случае все связи концентрируются в одном месте и могу быть легко устранены/заменены/итп.
 

tashkentchi

Новичок
Alexandre, это не будет работать.

-~{}~ 27.03.08 18:15:

whirlwind, взято на вооружение.
 

whirlwind

TDD infected, paranoid
PS. Кстати, вот такой вариант тоже можно использовать как альтернативу

PHP:
$user = Main::getInstance()->init(new User());
Это избавляет пользователя класса от деталей реализации User, а класс User от сингельтона.
 

Духовность™

Продвинутый новичок
whirlwind
про фабрику не понял. как она должна в данном случае выглядеть?
Ведь все равно придется в самой фабрике завязывать user на $dbObject-e, т.е. как-то придется передавать в класс user объект БД.
 
Сверху