Насколько правильно так делать (ООП)

Духовность™

Продвинутый новичок
Насколько правильно так делать (ООП)

Привет всем!

У меня есть класс user, который отвечает за минимальные действия с текщим пользователем - обновляет IP, время посещения, возвращает пользовательские данные.

Но поскольку любому пользователю я могу присвоить определенные права, то возникла необходимость сделать отдельный класс userActions для работы исключительно с правами.

Так вот, у меня в коде получается такая конструкция:

PHP:
class user
{
//....

    // Этот пользователь принадлежит к группе модераторов.
    if ($this->db->getNumRows() == 1)
    {
        // Получаем объект класса userActions со всеми настройками и методами
        // нужными для работы с правами доступа.
        $this->userActions = new userActions($this);
    }
}



class userActions
{
     function __construct(&$user)
    {
        //....
        $this->user = $user;
        //...
    }
}
Далее я работаю с объектом класса user примерно так:

PHP:
if (!$user->userActions->checkActionsById($id_action)) echo 'Пошел вон!';
Меня вот что интересует - так вообще корректно писать - передавать из основного класса (user) в дополнительный класс (userActions) ссылку на самого себя? Как вы считаете?
 

AmdY

Пью пиво
Команда форума
function __construct(&$user)
а зачем здесь & если ты передаёшь объект, который итак в РНР5 передаётся по ссылке?
 

whirlwind

TDD infected, paranoid
Я бы не советовал потому что

1. Образуется циклические ссылки с которыми в PHP сейчас проблемы
2. Что появилось первее - курица или яйцо?
3. user зависит от реализации, т.к. инстанцирует экземпляр другого класса

Если нарисовать схемку, то получается путаница. Получается что юзер, за счет композиции объекта доступа знает не только о правах но и о всех объектах, к которым эти права определяют доступ. В случае если в userActions ошибка (и/или в тех объектах, которые использует userActions), то она будет возникать не только в момент проверки прав, но при каждом инстанцировании user. Это далеко не одно и то же. К тому же userActions (механизм-закон) я подозреваю что он единый для всех пользователей.

В качестве примера: принятие нового закона не приводит к тому что всем людям делают операцию :)

ИМХО так более правильно

PHP:
if (!$userActions->checkActionsById($user,$id_action)) echo 'Пошел вон!';
1. Мы разгрузили user от зависимости.
2. Мы можем спокойно добавлять новые механизмы прав доступа одного субъекта к другому при этом не меняя код user.
3. Нет циклических ссылок - можно без опаски эксплуатировать в долгоиграющих задачах
 
Сверху