Ссылка на переменные сеанса в PHP - PullRequest
7 голосов
/ 13 ноября 2011

Допустим, я храню массив или объект с именем $_SESSION["logged_in_user"].

Если мне нужно обращаться к нему несколько раз по всему сценарию, что из следующего является «наилучшей практикой»?

  • Используйте $_SESSION["logged_in_user"] каждый раз (т. Е. $_SESSION["logged_in_user"]["first_name"])?

  • Скопировать объект в новую переменную, например $logged_in = $_SESSION["logged_in_user"]?

  • Создайте ссылку на переменную сеанса, например $logged_in =& $_SESSION["logged_in_user"]

Я, вероятно, слишком обдумываю это, но мои главные проблемы - это издержки скрипта ичитаемость.Я не уверен, что если ссылка на переменную сеанса повторяется медленнее, чем ссылка на объявленную inline переменную.Я также не знаю, добавляет ли копирование переменной сеанса в «обычную» переменную больше накладных расходов, чем необходимо.Мне нравится читаемость $logged_in["first_name"] более $_SESSION["logged_in_user"]["first_name"].

Так есть ли здесь лучшая практика, или она действительно не имеет значения?

Ответы [ 5 ]

7 голосов
/ 13 ноября 2011

$_SESSION - это специальный суперглобальный массив PHP.Таким образом, технически вы можете ссылаться на него в любое время, просто используя его:

$_SESSION['logged_in_user']

Однако, это также особенное, потому что оно может измениться.В следующем примере это видно:

$alias =& $_SESSION;
session_start();
$alias['foo'] = 'bar';

Этот код не будет установлен $_SESSION['foo'].$alias указывает на предыдущий $_SESSION, session_start() создал новый сеанс.

Если вы знаете подобные предупреждения, вы, естественно, можете создать свою собственную $_SESSION абстракцию.

6 голосов
/ 13 ноября 2011

Вы не задумываетесь над этим .... мышление - это хорошо!

Я лично использую Symfony 1.4 для кодирования, что решает подобные проблемы, но вы можете выбрать, чтобы оставаться стройными: -)

Я бы подумал, ОО (объектно-ориентированный).Создайте пользовательский класс.Затем сделайте вызовы, такие как UserFactory :: getCurrentUser () или User :: getCurrentUser (), которые будут возвращать зарегистрированный в данный момент пользовательский объект.Среди переменных-членов этого класса будет user_id.Однако вы сможете добавить дополнительные функции и данные в этот класс.

Помните, что думать в ОО означает использование абстрактных терминов, которые очень близки к проблемной области.Пользователь, Автомобиль, Заказ и т. Д. Вам не нужно быть конкретным, и вам не нужно включать всю доступную информацию в этот класс, чтобы она была «полной», какой бы она ни была.Включайте только те данные, которые вам нужны в данный момент (помните yagni ).Классы - это иллюзии конкретных вещей в реальном мире.Точно так же, как 3D-моделирование - это иллюзия реального мира.

Надеюсь, это поможет ...

1 голос
/ 13 ноября 2011
$_SESSION["logged_in_user"]["first_name"]

Оставайтесь простыми;& не добавляйте накладные расходы на создание новых комнат для тех же переменных.

1 голос
/ 13 ноября 2011

Вы можете создать класс для управления сеансом:

class MySession {

  public static &get( $key ){

    if( !array_key_exists( $key, $_SESSION ){
      return null;
    } 

    return $_SESSION[$key];

  }

}

Таким образом, вам не нужно беспокоиться о том, как получить значения, вы не дублируете никакие данные:

$first_name = MySession::get( 'first_name' );

Примечание: это решение имеет дело с доступом к сеансу, а не с вашей конкретной реализацией:)

1 голос
/ 13 ноября 2011

Вы не слишком обдумываете это, по моему мнению.

Но если у вас нет некоторого класса сессионной оболочки / менеджера, я бы просто использовал:

$_SESSION['logged_in_user']

В любом случае, это не так уж важно. Используйте все, что подходит для вас .

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