За последние 24 часа нас посетили 102272 программиста и 5662 робота. Сейчас ищут 2714 программистов ...

Passing null to parameter #2 ($subject) of type string is deprecated in

Тема в разделе "PHP для новичков", создана пользователем SBAlex, 1 авг 2023.

  1. SBAlex

    SBAlex Новичок

    С нами с:
    20 апр 2022
    Сообщения:
    26
    Симпатии:
    1
    Друзья, у меня проблема которую не получается победить. Обновил версию PHP у себя с 7.2 до 8.2. После этого часть кода начало вызывать нотисы и ошибки. Начал адаптировать код под 8.2. По большей части все получается. Но столкнулся ошибкой которую не смог победить, и не нашел инфу в интернтете как это сделать.

    Есть такой метод в классе:

    PHP:
    1. public function match($regex, $userAgent = null)
    2.     {
    3.     $match = (bool) preg_match(sprintf('#%s#is', $regex), (false === empty($userAgent) ? $userAgent : $this->userAgent), $matches);
    4.  
    5.     if ($match)
    6.         {  
    7.         $this->matchingRegex = $regex;
    8.         $this->matchesArray = $matches;
    9.         }
    10.     return $match;
    11.     }
    Постоянно идет ругань на строчку номер 3. Ошибка вот такая:
    Deprecated: preg_match(): Passing null to parameter #2 ($subject) of type string is deprecated in

    Уже голову сломал в чем ошибка. На строчке 3 располагается вот эта строчка метода:
    $match = (bool) preg_match(sprintf('#%s#is', $regex), (false === empty($userAgent) ? $userAgent : $this->userAgent), $matches);

    Не получается своим умом дойти как ее переписать чтобы все работало и не вызывало ошибок. Прошу помощи.

    p.s.: на PHP 7.2 все работает идеально, а вот с PHP 8.2 - проблема.
     
  2. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    Вероятно вот это выражение во втором параметре не имеет определенного значения:
    (false===empty($userAgent) ? $userAgent:$this->userAgent)
    на него и ругается.
     
  3. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    Попробуй вместо public function match($regex, $userAgent = null) заменить на
    public function match($regex, $userAgent = '')
    а в preg_math(sprintf('#%s#is',$regex),(false===($userAgent == '') ? $userAgent:$this->userAgent),$matches);
     
  4. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    Проверьте $this->userAgent
    PHP:
    1. // вместо
    2. false === empty($userAgent) ? $userAgent : $this->userAgent
    3. // можно применить
    4. $userAgent ?: $this->userAgent
     
  5. SBAlex

    SBAlex Новичок

    С нами с:
    20 апр 2022
    Сообщения:
    26
    Симпатии:
    1
    Друзья, всем спасибо, буду пробовать. Какая то жесть с этим PHP 8.2. Такое впечатление что скоро нас ждет глобальная переработка PHP и часто старого привычного перестанет работать совсем.
     
  6. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    945
    Симпатии:
    146
    Разработку нужно вести с включенными сообщениями об ошибках
    PHP:
    1. ini_set("display_errors", true);
    и ловить всякую бяку сразу, а не спустя годы.
     
  7. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    626
    Симпатии:
    24
    @don.bidon а то что в вопросе ТС пишет сообщение ошибки, что null устарело для передачи строкой приведением типа - этого недостаточно?
    --- Добавлено ---
    @Sail то есть мы null проверяем на булев - браво, а ещё если строгую типизацию замостырим, то у нас нуллейбл строка приводится к булеву, вместо того, чтобы в регулярке обозначить начало и конец строки паттерна
     
    MouseZver нравится это.
  8. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.834
    Симпатии:
    1.335
    Адрес:
    Лень
    там false с результатом конструкции empty сверяется - нахрена ? не ко мне. Наверно имелось ввиду ! empty ( ... )
    А null возвращается с userAgent, где ее присвоение протухло, либо нет. Поэтому из класса берется что-то подобное по дефолту:

    public $userAgent = null;
     
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.125
    Симпатии:
    1.222
    Адрес:
    там-сям
    Вот такое упрощение должно дать нужный результат:
    PHP:
    1. $userAgent ?? $this->userAgent
    НО! Надо быть уверенным, что в $this->userAgent не-null значение по умолчанию.
     
  10. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    Первый совет уже охаяли раскритиковали (#7), а на второй - не обратили внимания.. или уже воспользовались и молчат (#4)
    :rolleyes: