2010-01-16 2 views
2

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

$session = Session::getInstance(); 

это будет возвращать объект сеанса мне использовать либо начать новый объект сеанса, если один не был запущен еще.

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

+1

Именно поэтому мы продолжаем сообщать вам использовать контейнер для инъекций для зависимостей. Опять же, см. Http://www.slideshare.net/fabpot/dependency-injection-with-php-and-php-53 – Gordon

+0

@Gordan , иногда мне требуется некоторое время, чтобы «получить» вещи, что слайд-шоу полезно для меня сейчас, спасибо – JasonDavis

ответ

2

В шаблоне Singleton вам действительно нужно будет это сделать.

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

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

+0

Спасибо, что это может быть хорошим решением, а не повторять один и тот же код снова и снова, затем я получаю доступ к функции или переменной объект сеанса вроде этого, $ this-> session-> get() или как этот $ session-> get() или каким-либо другим способом? спасибо – JasonDavis

+0

'$ this-> session-> get()' это. @Pikrass имеет полный пример в своем ответе. –

+0

очень круто, спасибо – JasonDavis

1

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

class Database { 
    private $session; 

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

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

+0

спасибо хороший пример – JasonDavis

-1

В качестве альтернативы вы можете сделать эту $session глобальной переменной.

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

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

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

1

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

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(); 

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

// example usage 
$session = SuperSession::getInstance(); // SuperSession is like Session, 
             // but better! same interface though. 
$user = new User($session); 
$user->methodOne(); 
1

Поскольку 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) 
    } 
} 

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

Смежные вопросы