В методах класса иногда приходиться работать с сессиями. Вопрос:
лучше в методе класса вызывать session_start() или вынести перед описанием класса?
Т.е.
class somaClass {
public function() {
session_start();
...
}
}
или
session_start();
class somaClass {
public function() {
...
}
}
Также это относится и при использовании каких-то модулей. Нужно их к методе модули подключать, чтобы использовать классы модулей в методе. Или перед классом вынести? ?
Большой разницы нету, главное что бы сессия начиналась до того как будет отправлен хоть один знак клиенту. Все зависит от ситуации, если Вы хотите использовать только в одном методе, то лучше в нем прописать старт, если во всем сайте, то лучше с самого начала, ну а если во всем классе, то можно и в конструкторе:
class somaClass {
public function __construct() {
session_start();
}
}
Главное знайте, что сессию можно начать только один раз, иначе будет ошибка.
session_start() Работать будет в любом случае только до начала вывода каких то данных (или пока сервер не начнет отдавать какие то данные), так что с точки зрения PHP правильного варианта нету.
Но вот с точки зрения архитектуры приложения плохой вариант выносить на каждую страницу начало сессии, потому что должен быть единый механизм выполнения страницы.
Например пользователь зашел на страницу вызывается класс подключения к базе данных, затем класс работы с сессиями и тд.
В разных CMS и фреймворках шаги разные и могут меняться но всегда есть некий модуль (класс) который работает с сессиями и потом просто на страницах вызывается.
Так что лучше делать все это в самом классе.
В современном 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
Сборка персонального компьютера от Artline: умный выбор для современных пользователей