Миграция PHP 7 => PHP 8

12
ArbNet
На сайте с 27.10.2019
Offline
124
543

Предлагаю в этой теме решать вопросы по перенастройке кода с PHP 7 на PHP 8

столкнулся с такой ошибкой:

Fatal error: Uncaught Error: Undefined constant "node\array_intersect"

В переменной $tar формировал массивы, аргументы для функции array_intersect затем вызывал её таким образом.

call_user_func_array(array_intersect,$tar);

Напрямую вызывать не могу так как количество массивов в аргументах заранее не известно.

Теперь PHP говорит, что функции такой нет. Есть мысли как исправить ошибку?

Обсуждение разработки на моём фреймворке https://discord.gg/23N4s9x2kp
LEOnidUKG
На сайте с 25.11.2006
Offline
1722
#1
call_user_func_array('array_intersect',$tar);

Если так?

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
inok-woin
На сайте с 17.08.2010
Offline
79
#2
А какой смысл в этой затее?
Меньше слов, больше дела!
LEOnidUKG
На сайте с 25.11.2006
Offline
1722
#3
inok-woin #:
А какой смысл в этой затее?

О какой именно? Приводить код согласно документации, которая теперь строгая в PHP 8?

Да не зачем, по сути. 

ArbNet
На сайте с 27.10.2019
Offline
124
#4
LEOnidUKG #:

Если так?

Uncaught ArgumentCountError: array_intersect() does not accept unknown named parameters

Дело в том что array_intersect это стандартная функция. Теперь я так понимаю нельзя стандартные функции вызывать как callback. Тогда что они могут предложить взамен?

Я использовал данную конструкцию для сортировки данных.

inok-woin #:
А какой смысл в этой затее?

Знаете анекдот: "А где оно?" 😀

LEOnidUKG
На сайте с 25.11.2006
Offline
1722
#5
ArbNet #:

Дело в том что это(array_intersect) стандартная функция. Теперь я так понимаю нельзя стандартные функции вызывать через callback. Тогда что они могут предложить взамен?

Всё она вызывает без проблем.

<?php

$tar[0]=array('1');

$tar[1]=array('1');

call_user_func_array('array_intersect',$tar);

?>

Этот код работает без ошибок.  У вас ошибка другая теперь:

https://wiki.php.net/rfc/named_params

ищите по "does not accept unknown named parameters"

-S
На сайте с 10.12.2006
Offline
Модератор1354
#6
inok-woin #:
А какой смысл в этой затее?

Странный вопрос.

ArbNet
На сайте с 27.10.2019
Offline
124
#7
LEOnidUKG #:

Этот код работает без ошибок. 

Я так понимаю они упростили функцию array_intersect, так как раньше она обрабатывала это

Array
(
    [htm] => Array
        (
            [0] => catalog
        )

    [css] => Array
        (
            [0] => catalog
        )

)

возвращая

Array(
        [0] => catalog
)

До меня дошло 😀 Наверно теперь [htm] и [css] принимаются как именованные аргументы функции, а так как именованных аргументов в array_intersect нет, то выдаёт ошибку.

Да. Вот так работает.

$tar=Array(
    0 => Array
        (
            'catalog'
        ),

    1 => Array
        (
            'catalog'
        )

);

Получается теперь нужно убирать ключи.

LEOnidUKG
На сайте с 25.11.2006
Offline
1722
#8

Можно заюзать как сделал drupal, через функцию:

https://www.php.net/manual/ru/function.array-values.php

call_user_func_array('array_intersect', array_values ($tar));


ArbNet
На сайте с 27.10.2019
Offline
124
#9

В некоторых местах придётся переписывать код заново.

ЗЫ. У меня вот функция сортировки получала массив с списком htm, css файлов и если были одинаковые имена, то создавала массив с этими именами(как компонент), а те что без тёски так скажем оставляла в исходном массиве. То есть мне нужны ключи htm и css чтобы если останутся файлы без тёсок выводить их по отдельности. А у которых есть пара(тёска) это компонент который редактируется вместе макет и стили к нему.

SeVlad
На сайте с 03.11.2008
Offline
1609
#10
LEOnidUKG #:
О какой именно? Приводить код согласно документации, которая теперь строгая в PHP 8?
Это бот. Акк 7 лет молчал, а 3 дня назад активизировался.
Делаю хорошие сайты хорошим людям. Предпочтение коммерческим направлениям. Связь со мной через http://wp.me/P3YHjQ-3.
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий