Странное эхо, поведение печати в PHP?

Следующий код выводит 43211 , почему?

  echo print('3').'2'.print('4'); 

Ваше заявление анализирует людей следующим образом.

Эхо-конкатенированная строка, состоящая из:

  1. Результат функции print('3') , который вернет true, который будет привязан к 1
  2. Строка '2'
  3. Результат функции print('4') , который вернет true, который будет привязан к 1

Теперь порядок операций здесь действительно смешной, и это никак не может быть 43211 с 43211 ! Давайте попробуем вариант, чтобы понять, что происходит не так.

 echo '1' . print('2') . '3' . print('4') . '5'; 

Это дает 4523111

PHP анализирует это, а затем:

 echo '1' . (print('2' . '3')) . (print('4' . '5')); 

Бинго! Сначала print слева, напечатав '45' , что оставляет нас

 echo '1' . (print('2' . '3')) . '1'; 

Затем левая print оценивается, поэтому мы теперь напечатали '4523' , оставив нас с

 echo '1' . '1' . '1'; 

Успех. 4523111 .

Давайте раскроем ваше заявление о странности.

 echo print('3') . '2' . print('4'); 

Сначала это напечатает '4' , оставив нас

 echo print('3' . '2' . '1'); 

Затем вычисляется следующий оператор печати, что означает, что мы теперь напечатали '4321' , оставив нас с

 echo '1'; 

Таким образом, 43211 .

Я бы предпочел не повторять результат print и не print результаты echo . Для этого совершенно бессмысленно.


После дальнейшего рассмотрения я на самом деле не совсем уверен, как PHP разбирает любой из этих кусков глупостей. Я больше не буду об этом думать, это больно моему мозгу.

Большая часть путаницы связана с размещением круглых скобок вокруг аргументов для print . Как вы знаете, круглые скобки необязательны с языковыми конструкциями; то, что вы, вероятно, не знали, это то, что они удаляются во время разбора.

Порядок оценки

Сначала удалим скобки:

 echo print '3' . '2' . print '4'; 

И проиллюстрируем фактический порядок оценки:

 echo (print ('3' . '2' . (print '4'))) ^ ^ ^ ^ 3 2 1--------->>----------1 

В основе этого вы найдете конкатенацию строк или строковых представлений; это сначала оценивается:

 '3' . '2' . (print '4') 

Первые два элемента объединяются:

 '32' . (print '4') 

Затем оценивается значение (print '4') ; после печати его аргумента '4' , возвращаемое значение самой print всегда является int(1) ; это вставляется в строку '1' и объединяется с другими элементами:

 '321' 

Это завершает первый шаг. Второй шаг передает временные результаты в другой оператор print :

 print '321' 

По-прежнему печатается '321' и теперь для последнего шага возвращается int(1) :

 echo 1 

доказательство

Вы можете подтвердить это поведение, когда смотрите на коды операций, которые сгенерированы (выходной столбец добавлен для ясности):

 line # * op return operands output ------------------------------------------------+------- 1 0 > CONCAT ~0 '3', '2' | 1 PRINT ~1 '4' | 4 2 CONCAT ~2 ~0, ~1 | 4 3 PRINT ~3 ~2 | 4321 4 ECHO ~3 | 43211 

объяснение

  • "3" и "2" объединяются – "32" – и сохраняются в ~0 .
  • "4" печатается, а возвращаемое значение int(1) сохраняется в ~1 .
  • ~0 и ~1 объединяются – "321" – и сохраняются в ~2 .
  • Печатается "321" а возвращаемое значение сохраняется в ~3 .
  • int(1) печатается как "1" из-за струнного литья.

print возвращается 1

О документации

Возвращаемые значения: Возвращает 1, всегда.

Вероятно, вы просто должны использовать echo .

Вы используете функцию внутри функции, как сказал alex. Просто используйте эхо или печать.

 echo '3'.'2'.'4'; 

вернется правильно или аналогично для печати.