За последние 24 часа нас посетили 22624 программиста и 1209 роботов. Сейчас ищут 793 программиста ...

Помогите разобраться Array to string conversion в PHP7

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

  1. tyshka

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

    С нами с:
    4 фев 2015
    Сообщения:
    21
    Симпатии:
    0
    Notice: Array to string conversion in
    Notice: Undefined property: PanelGenerator::$Array in
    Fatal error: Uncaught Error: Function name must be a string in

    указывается строка
    PHP:
    1. $out .= $this->$option['type']( $option );
    используется эта строка в foreach

    var_dump( $options );
    var_dump( $option );

    показывает что данные не пустые

    PHP:
    1. foreach( $options as $option ) {
    2.     $out .= $this->$option['type']( $option );
    3. }
    в PHP5 все работает отлично
     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    // Ванга-мод ON
    Код (Text):
    1. $out .= $this->{$option['type']}( $option );
    // OFF
     
    tyshka нравится это.
  3. tyshka

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

    С нами с:
    4 фев 2015
    Сообщения:
    21
    Симпатии:
    0
    Спасибо! Работает!
     
  4. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    А почему работает, поняли? Это очень важно.
     
  5. tyshka

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

    С нами с:
    4 фев 2015
    Сообщения:
    21
    Симпатии:
    0
    Сложный (фигурный) синтаксис https://php.ru/manual/language.types.string.html - правильно?
     
  6. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @tyshka, нельзя обращаться с массивом как с строкой.
     
    #6 mahmuzar, 23 дек 2016
    Последнее редактирование: 23 дек 2016
  7. tyshka

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

    С нами с:
    4 фев 2015
    Сообщения:
    21
    Симпатии:
    0
    почему в php5 не было ошибки, а в php7 это уже фатальная ошибка?
     
  8. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @tyshka, не знаю почему работало в php 5, но заключается в фигурные скобки для обработки значения массива. Т.е. выше без скобок тебе передавался массив, а заключив в фигурные скобки переменная обработалась как надо, в итоге получил переменную. Это сложный синтаксис обработки переменных.
    --- Добавлено ---
    http://php.net/manual/ru/language.types.string - пункт "обработка переменных".
     
  9. tyshka

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

    С нами с:
    4 фев 2015
    Сообщения:
    21
    Симпатии:
    0
    Видимо потому что работало в php 5 это и вызвало мое замешательство... Спасибо всем ответившим!
     
  10. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    @tyshka в PHP7 изменён парсер в целях ускорения. Теперь переменная разбирается строго слева направо. Таким образом, получается $this - объект, $option - имя свойства объекта, ['type'] - элемент массива в свойстве, () - вызов функции с именем-строкой из этого элемента массива объекта.
    Поскольку option - это массив, по правилам приведения типов он превращается в слово Array с выбрасыванием ошибки. У $this нет такого свойства нет, соответственно имя функции оказывается null и получается Fatal. Подробно в доке http://bit.ly/2inWjSy

    Теперь надо привыкать к следующей логике:
    PHP:
    1. class MyClass {
    2.  
    3.   public $names = ['One' => 'Fn'];
    4.  
    5.   public function run($arrName) {
    6.     $this->$arrName['One']();
    7.   }
    8.  
    9. }
    10.  
    11. function Fn() {
    12.   echo 'Bingo!';
    13. }
    14.  
    15. $o = new MyClass;
    16. $o->run('names');
    --- Добавлено ---
    В PHP 5 будет
     
    denis01 и mahmuzar нравится это.
  11. tyshka

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

    С нами с:
    4 фев 2015
    Сообщения:
    21
    Симпатии:
    0
    Понятно
     
  12. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @[vs], объяснил хорошо, пример несколько запутанный дал, это специально?))
     
  13. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    @mahmuzar мне кажется, этот пример воспроизводит ситуацию ТС. На PHP5 в фнукцию run() можно передать массив ['One'=>'Fn'] и ожидать, что это приведет к вызову $this->fn().
     
    mahmuzar нравится это.
  14. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    зато какой наглядный
     
    mahmuzar нравится это.
  15. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @[vs], просто fn() вне класса.
    --- Добавлено ---
    @[vs],@denis01, теперь понял, до меня не сразу дошло, что ты предполагал.
     
  16. opalko

    opalko Гость

    С нами с:
    2 ноя 2021
    Сообщения:
    1
    Симпатии:
    0
    Как это побороть? Ошибки

    PHP Notice: Array to string conversion in

    В коде
    Код (Text):
    1.    <a href="<?php echo ${'sort_' . $field}; ?>" class="<?php echo ($sort == ${'sort_' . $field}) ? strtolower($order) : ''; ?>" title="<?php echo ${'text_' . $field}; ?>"><i class="fa fa-image fa-2x"></i></a>
    2.  
    и
    В коде
    Код (Text):
    1.    <a href="<?php echo ${'sort_' . $field}; ?>" class="<?php echo ($sort == ${'sort_' . $field}) ? strtolower($order) : ''; ?>"><?php echo ${'text_' . $field}; ?></a>
    2.