Нужно ли захватывать объект класса PHP в каждом методе класса? - PullRequest
2 голосов
/ 17 января 2010

Я работаю над некоторыми классами PHP, у меня есть класс сеанса, который используется для установки и получения значений для переменных сеанса, мне нужно будет иметь доступ к этому объекту класса сеанса в любом другом классе, поэтому я создал метод singleton в сеансе класс, а затем в других методах класса я могу вызвать объект сеанса, как это ....

$session = Session::getInstance();

Это вернет мне объект сеанса для использования или запуска нового объекта сеанса, если он еще не был запущен.

Итак, мой вопрос, если у меня есть пользовательский класс и класс базы данных, и у каждого класса есть 10 методов в каждом, которым требуется доступ к объекту сеанса, то мне нужно будет запустить приведенный выше код внутри каждого метода или просто 1 время внутри класса и тогда все методы будут иметь его? Я новичок в этом, поэтому я не уверен ??? Спасибо

Ответы [ 5 ]

2 голосов
/ 17 января 2010

В паттерне синглтона вам действительно придется это сделать.

Альтернативой может быть добавление объекта сеанса в качестве защищенного члена $session вашего класса в конструктор, а затем доступ к нему из каждого метода как $this->session.

Если вы хотите прочитать более широкую дискуссию о том, как упорядочить и использовать вспомогательные и библиотечные объекты в PHP, я задал связанный SO вопрос , когда он дал интересные ответы.

1 голос
/ 17 января 2010

Поскольку PHP обрабатывает объекты по ссылке, технически у вас может быть базовый класс, который захватывает экземпляр сеанса в конструкторе

abstract class AbstractSessionEnabledClass {

    public function  __constructor() {
        $this->session = Session::getInstance();
    }

    private $session = null;
}

А потом пусть ваши подклассы расширяют этот класс

class SomeClass extends AbstractSessionEnabledClass {
    public function __constructor() {
        parent::__constrcutor(); //this isn't needed if this class has no constructor
    }

    public function someMethod() {
        var_dump($this->session)
    }
}

Этот тип инкапсуляции фактически облегчит изменение вашего кода в случае изменения обработки сеанса.

1 голос
/ 17 января 2010

Вы хотите установить сеанс в конструкторе. Однако для большей гибкости может быть лучше передать объект сеанса в:

class User {

  private $session;

  public function __construct(Session $session) {
    $this->session = $session;
  }

  public function methodOne() {
    $stuff = $this->session->getStuff();
    // etc...
  }

}

// example usage
$session = Session::getInstance();
$user = new User($session);
$user->methodOne();

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

// example usage
$session = SuperSession::getInstance(); // SuperSession is like Session,
                                        // but better! same interface though.
$user = new User($session);
$user->methodOne();
1 голос
/ 17 января 2010

Запустите ваш метод в конструкторе каждого класса и сохраните полученный объект как переменную экземпляра.

class Database {
    private $session;

    function Database() {
        $this->session = Session::getInstance();
    }
}

Затем вы можете получить доступ к своему экземпляру Session в методах с $ this-> session.

0 голосов
/ 17 января 2010

Кроме того, вы можете вместо этого сделать $session глобальной переменной.

$GLOBALS["session"] = Session::getInstance();

Затем вы можете манипулировать $GLOBALS["session"] из любого места.

Но если вы хотите, чтобы ваш код соответствовал идеализированной дисциплине ООП, придерживайтесь ответа Пекки:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...