За последние 24 часа нас посетили 37926 программистов и 1807 роботов. Сейчас ищут 850 программистов ...

Ошибка приведения типа

Тема в разделе "PHP для новичков", создана пользователем Любитель котиков, 23 июл 2018.

  1. Любитель котиков

    С нами с:
    23 окт 2017
    Сообщения:
    26
    Симпатии:
    1
    Я пишу
    PHP:
    1. $someFunction = [$myObject, 'myMethod'];
    2. new ReflectionFunction($someFunction)
    И все грохается с ошибкой "ReflectionFunction::__construct() expects parameter 1 to be string, array given". На php 5.6 это работало, а на php 7.2 нет... Ну понятно что ввели строгую типизацию, но ведь этот способ через массив - единственный способ сослаться на метод объекта.

    P.S. ReflectionMethod не советовать. В конструктор может попасть и обычная функция - не метод.
     
  2. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
  3. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.817
    Симпатии:
    1.333
    Адрес:
    Лень
    Все таки с методом на всякий случай
    Пример:
    PHP:
    1. $ReflectionMethod = new ReflectionMethod( 'mysqli_stmt', 'bind_param' );
    2.  
    3.         $ReflectionMethod -> invokeArgs( $this -> lerma -> statement, $for );
    --- Добавлено ---
    PHP:
    1. $someFunction = [$myObject, 'myMethod'];
    2.  
    3. new ReflectionFunction( ...$someFunction )
     
  4. Любитель котиков

    С нами с:
    23 окт 2017
    Сообщения:
    26
    Симпатии:
    1
    Капитоша спешит на помощь? Ожидается строка или замыкание. По идее просто callable.
    --- Добавлено ---
    И что это за точки? Будет ошибка интерпретации...
     
  5. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.817
    Симпатии:
    1.333
    Адрес:
    Лень
    1. Я по глупости забыл что, рефлФун принимает один параметр.
    2. точки - это распаковка значений с массива
     
  6. Любитель котиков

    С нами с:
    23 окт 2017
    Сообщения:
    26
    Симпатии:
    1
    Ало! В пыхе нет распаковки. Это тебе не питон...
     
  7. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.817
    Симпатии:
    1.333
    Адрес:
    Лень
    пора тебе проснуться
    https://habr.com/post/198980/
     
  8. Любитель котиков

    С нами с:
    23 окт 2017
    Сообщения:
    26
    Симпатии:
    1
    Ты имеешь ввиду переменное количество аргументов? Я знаю. Но у тебя был написан именно вызов функции (конструктора), а не прототип. Я подумал что речь о распаковке массива в параметры как в питоне - такого в пыхе точно нет (к сожалению).
     
  9. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
  10. Любитель котиков

    С нами с:
    23 окт 2017
    Сообщения:
    26
    Симпатии:
    1
  11. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
  12. Любитель котиков

    С нами с:
    23 окт 2017
    Сообщения:
    26
    Симпатии:
    1
    Нет. Это переменное количество аргументов. Вот распаковка. Я уже давал эту ссылку черт побери.

    Впрочем какая разница как это называется. Тема не об этом.
     
  13. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
  14. Любитель котиков

    С нами с:
    23 окт 2017
    Сообщения:
    26
    Симпатии:
    1
    Тем что в питоне я могу в эту функцию передать переменную массив и он распакуется при вызове в параметры. Там может быть даже не переменное количество аргументов и я все равно могу передать массив, даже с ключами и они распакуются в соответствующие переменные функции. Короче это сейчас перерастет в холивар пхп вс питон поэтому кончайте.
     
  15. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    Случайно не вот этот код ?
    Код (Text):
    1. mas = [1, 2, 3, 4, 5]
    2. summ(*mas) #такой вызов эквивалентен вызову summ(1, 2, 3, 4, 5)
    Ну, если мы напишем
    PHP:
    1. $toSum = [1,2,3,4,5,6];
    2. var_dump(catLoverFails(...$toSum));
    То будет точно так же.
     
  16. Любитель котиков

    С нами с:
    23 окт 2017
    Сообщения:
    26
    Симпатии:
    1
    Решение я уже нашел - сделал проверку: если массив то юзаю ReflectionMethod предварительно распаковав его с помощью list, иначе ReflectionFunction. Тему можно закрыть.
     
  17. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    В похапе с этим прозрачнее, эту возможность оставляют за вами, чтобы не было недоразумений.
     
  18. Любитель котиков

    С нами с:
    23 окт 2017
    Сообщения:
    26
    Симпатии:
    1
    Хмм, ну ок. Я не знал что так можно вызвать.
    --- Добавлено ---
    Это ужасно. А потом мучайся с необъявленными переменными. Нет. Не убеждайте меня. Я люто ненавижу пхп и пишу на нем только потому что вынужден. Я вообще сторонник статически типизируемых языков.
     
  19. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.817
    Симпатии:
    1.333
    Адрес:
    Лень
    на данный момент "точки" ... служат ( по русски назвать ) распаковщиками / запаковщиками
     
  20. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    Не долго осталось и в пышке будет полная возможность к строгой типизации, я надеюсь. Во всяком случае уже сейчас на уровне ООП можно обмазаться строгостью чуть более чем полностью, правда существуют нюансы.
    isset в помощь. В любом случае, входные данные являются массивом и как вы его и где составляете это ваши проблемы.
     
  21. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    нафиг так жить, если ты не в состоянии даже сообщение об ошибке перевести:D. Короче, первым делом translate.google.com потом дока. А на форум можешь забить, ты и так умный.))
     
    MouseZver нравится это.
  22. Любитель котиков

    С нами с:
    23 окт 2017
    Сообщения:
    26
    Симпатии:
    1
    Ты видно совсем глупенький? Или троллишь. Никак не пойму.
     
  23. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.817
    Симпатии:
    1.333
    Адрес:
    Лень