в правильном ли месте вызываю session_start()?

177
04 января 2019, 09:10

В методах класса иногда приходиться работать с сессиями. Вопрос:

лучше в методе класса вызывать session_start() или вынести перед описанием класса?

Т.е.

class somaClass {
   public function() {
     session_start();
     ...
   } 
}

или

session_start();
class somaClass {
   public function() {
     ...
   } 
}

Также это относится и при использовании каких-то модулей. Нужно их к методе модули подключать, чтобы использовать классы модулей в методе. Или перед классом вынести? ?

Answer 1

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

class somaClass {
  public function __construct() {
    session_start();
  } 
}

Главное знайте, что сессию можно начать только один раз, иначе будет ошибка.

Answer 2

session_start() Работать будет в любом случае только до начала вывода каких то данных (или пока сервер не начнет отдавать какие то данные), так что с точки зрения PHP правильного варианта нету.

Но вот с точки зрения архитектуры приложения плохой вариант выносить на каждую страницу начало сессии, потому что должен быть единый механизм выполнения страницы.
Например пользователь зашел на страницу вызывается класс подключения к базе данных, затем класс работы с сессиями и тд.
В разных CMS и фреймворках шаги разные и могут меняться но всегда есть некий модуль (класс) который работает с сессиями и потом просто на страницах вызывается.
Так что лучше делать все это в самом классе.

Answer 3

В современном PHP есть рекомендуемые стандарты написания и использования кода для разработчиков, PSR - PHP Standard Recommendation. И на ваш ответ PSR-1 отвечает явным и недвусмысленном образом вот в этой части:

Files SHOULD either declare symbols (classes, functions, constants, etc.) or cause side-effects (e.g. generate output, change .ini settings, etc.) but SHOULD NOT do both.

Файлы должны либо объявлять новые классы, функции, константы и т.д. либо выполнять какие-то действия. Но нельзя делать и то и другое. Вызов session_start с одновременным объявлением класса открыто противоречит этому базовому правилу. То есть фактически так написать можно и это будет работать, но это столь же плохая практика, как глобальные переменные и другие признаки плохого кода.

Должно быть именно:

class somaClass {
   public function() {
     session_start();
     ...
   } 
}

Возможно вы захотите перед session_start проверить, не запущена ли уже сессия была - для этого можно воспользоваться функцией session_status

READ ALSO
Фоново запустить в процессе выполнения php скрипта другой скрипт

Фоново запустить в процессе выполнения php скрипта другой скрипт

Не могу сообразить как сделать данноеВ процессе выполнения php скрипта мне нужно запустить еще один php файл

180
Как выбрать данные из нескольких таблиц с фильтрацией по определенным значениям

Как выбрать данные из нескольких таблиц с фильтрацией по определенным значениям

Считаю вопрос очень важным так как нигде ранее не встречал, поиск всех значений по одной большой таблице в которую они все записаны

163
Указание места хранения файла

Указание места хранения файла

С помощью кода ниже сохраняю картинки на хостинге и записываю их имена в БД

172
Как подписаться на изменение файла в файловой системе?

Как подписаться на изменение файла в файловой системе?

Хочу создать процесс, который посылал данные из файла, при изменении этих файловНа ум приходит только, в цикле на каждом тике проверять время...

165