#php #session
#php #сессия
Вопрос:
Допустим, я сохраняю массив или объект с именем $_SESSION["logged_in_user"]
.
Если мне нужно многократно ссылаться на это в скрипте, что из следующего является «наилучшей практикой»?
-
Использовать
$_SESSION["logged_in_user"]
каждый раз (т.е.$_SESSION["logged_in_user"]["first_name"]
)? -
Скопируйте объект в новую переменную, например
$logged_in = $_SESSION["logged_in_user"]
? -
Создайте ссылку на переменную сеанса, например
$logged_in =amp; $_SESSION["logged_in_user"]
Возможно, я переоцениваю это, но мои главные проблемы — это накладные расходы на скрипт и читаемость. Я не уверен, что многократное обращение к переменной сеанса происходит медленнее, чем обращение к переменной, объявленной во встроенном режиме. Я также не знаю, добавляет ли копирование переменной сеанса в «обычную» переменную больше накладных расходов, чем необходимо. Мне нравится удобочитаемость $logged_in["first_name"]
over $_SESSION["logged_in_user"]["first_name"]
.
Итак, есть ли здесь лучшая практика, или это действительно не имеет значения?
Комментарии:
1. это действительно не имеет значения. Все, что имеет смысл для вас. Однако ссылка действительно кажется немного излишней. Лично я бы предпочел создать новую переменную.
2. Я никогда не видел ссылочную переменную, созданную для
$_SESSION
переменной, но это похоже на микрооптимизацию, и это действительно ваше предпочтение.3. Обычно я создаю класс, который имеет дело с пользователями.
Ответ №1:
$_SESSION
это специальный PHP-суперглобальный массив. Таким образом, технически вы можете ссылаться на него, когда захотите, просто используя его:
$_SESSION['logged_in_user']
Однако это также особенное, потому что оно может меняться. Следующий пример делает это видимым:
$alias =amp; $_SESSION;
session_start();
$alias['foo'] = 'bar';
Этот код не будет установлен $_SESSION['foo']
. $alias
Указывает на предыдущий $_SESSION
, session_start()
создал новый сеанс.
Если вы знаете подобные предостережения, вы, естественно, можете создать свою собственную $_SESSION
абстракцию.
Ответ №2:
Ты не переусердствуешь с этим …. думать — это хорошо!
Я лично использую symfony 1.4 для написания кода, который решает подобные проблемы, но вы можете предпочесть оставаться бережливым 🙂
Я бы подумал, что OO (объектно-ориентированный). Создайте пользовательский класс. Затем выполните вызовы типа UserFactory::getCurrentUser() или User ::getCurrentUser(), которые вернут объект пользователя, вошедшего в систему в данный момент. Среди переменных-членов этого класса будет user_id. Однако вы сможете добавить дополнительные функции и данные в этот класс.
Помните, что думать в OO означает использовать абстрактные термины, которые очень близки к предметной области. Пользователь, автомобиль, заказ и т.д. Вам не обязательно быть конкретным, и вам не обязательно включать всю доступную информацию в этот класс, чтобы он был «полным», что бы это ни было. Включайте только те данные, которые вам нужны в данный момент (помните о yagni). Классы — это иллюзии конкретных вещей реального мира. Точно так же, как 3D-моделирование — это иллюзия реального мира.
Надеюсь, это поможет…
Комментарии:
1. полностью. это именно то, что я имел в виду под классом-оболочкой сеанса.
Ответ №3:
Вы можете создать класс для управления вашим сеансом:
class MySession {
public static amp;get( $key ){
if( !array_key_exists( $key, $_SESSION ){
return null;
}
return $_SESSION[$key];
}
}
Таким образом, вам не нужно беспокоиться о том, как извлекать значения, вы не дублируете какие-либо данные:
$first_name = MySession::get( 'first_name' );
Примечание: это решение касается доступа к сеансу, а не к вашей конкретной реализации 🙂
Комментарии:
1. Мне это нравится. Мне все еще трудно думать в терминах статических классов (я понимаю концепцию, но они никогда не приходят на ум в качестве решения). Один вопрос, в этом случае, не пришлось бы мне все еще вызывать
$first_name = MySession::get("logged_in_user['first_name']")
?2. Вы также можете использовать это напрямую, на самом деле это не имеет значения. Вам нужно делать то, что имеет наибольший смысл для каждого конкретного случая. Что касается конкретного примера, на который вы ссылаетесь, вам нужно было бы сначала получить массив «logged_in_user», а затем извлечь из него first_name .. Как я уже сказал, это было всего лишь предложение о том, как работать с сеансом. Ваша конкретная реализация требует сочетания этого с тем, что сказал Homer6.
Ответ №4:
$_SESSION["logged_in_user"]["first_name"]
Оставайтесь простыми; amp; не добавляйте излишества для создания новых комнат для тех же переменных.
Ответ №5:
На мой взгляд, вы не переоцениваете это.
Но если у вас нет какой-либо оболочки сеанса / класса менеджера, тогда я бы просто использовал:
$_SESSION['logged_in_user']
В любом случае, это не имеет большого значения. Используйте все, что подходит вам.