Задать вопрос
@phpcoder81

Нужно ли передавать POST, GET, SESSION в класс?

Мужики, вопрос такой, нужно ли передавать переменные POST, GET, SESSION в класс и работать внутри со своими переменными $this->get, $this->post, $this->session
Или внутри класса, в обычном виде, эти переменные всегда будут работать корректно?
  • Вопрос задан
  • 104 просмотра
Подписаться 2 Простой 1 комментарий
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 3
php666
@php666
PHP-макака
Что бы писать качественные оо-приложения, для начала избавься от знания того, что есть все эти суперглобалы. Они, конечно, используются, но их надо "оборачивать" их классами-сервисами. Это нетривиальная работа - сделать сервис Session, в котором инкапсулировать всю логику по работе с сесиями, избавившись от нативных функций в коде. Суперглобалы GPR тоже обернуть, навесить на них некоторую логику. В целом тебе правильно сказали - любые значения надо "перебрасывать" в объекты. Напрямую их использовать не нужно. Твои классы должны быть черными ящиками с интерфейсом для входа параметров. А откуда параметры пришли - из GPRC или еще откуда - классы знать не должны.

Я не претендую на истину, но я в своем фреймворке сделал вот такое решение:
class Request implements Singleton
{
    private function __construct()
    {
        $this->request_data = new RequestData($_REQUEST);
        $this->post_data = new PostData($_POST);
        $this->get_data = new GetData($_GET);
        $this->cookie_data = new CookieData($_COOKIE);
    }

    // ....

Те при инстанцировании приложения я создаю объекты с копиями данных из запроса. На каждый из массивов свой объект:
/**
 * Оболочка над GPCR массивами.
 */
abstract class Data extends CoverArray
{
    /**
     * @param array $data
     */
    public function __construct(array $data = array())
    {
        parent::__construct(self::clearData($data));
    }

    /**
     * Очищает массив от пробелов.
     *
     * @param array $in
     * @return array
     */
    private static function clearData(array &$in): array
    {
        if ($in && is_array($in)) {
            foreach ($in as $key => $value) {
                if (is_array($value)) {
                    self::clearData($in[$key]);
                } else {
                    $in[$key] = trim($value);
                }
            }
        }

        return $in;
    }
}

class Post extends Data
{
    /**
     * @param string $key
     * @param mixed $value
     */
    public function __set(string $key, $value)
    {
        parent::__set($key, $value);

        $_POST = $this->getDataAsArray();
    }

    /**
     * @param string $key
     */
    public function __unset(string $key)
    {
        parent::__unset($key);

        $_POST = $this->getDataAsArray();
    }
}

Класс-singelton Request доступен внутри контроллеров. Он создается в Application и передаетсяв конкретный контроллер. Соответственно, в контроллере я могу получить, например, POST так:
$this->getRequest()->getPost('region')

Тут особого профита как такового нет, но это - ООП-шно. Все классы объектов имеют интерфейсы, ничего из неоткуда не берется, как в случае с суперглобалами.

А дальше больше - можем наложить логику. Например, санитарную обработку:
echo $this->getRequest()->getPost('id', 'int'); // приведение к числу


это был пост-запрос?
echo (int) Request::isPost();

изменился ли документ?
if (!Request::IfModifiedSince($resource->getModificationTime())) {
    return $this->getResponse()->setHttpStatusCode(304);
}

т.е. любые обертки над суперглобалами неизбежно приводят к более приятному коду и повышают уровень возможностей.
Ответ написан
AleksandrB
@AleksandrB
Совсем недавно вывел "Hello world"
Нет, не нужно
Ответ написан
Комментировать
FanatPHP
@FanatPHP
Чебуратор тега РНР
Всегда будут работать корректно, но надо передавать в виде сервиса,потому что глобальные переменные - это зло.
Для примера можно посмотреть на Symfony HTTP foundation
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽