Как выполнится в php echo ... print;

Статус
В этой теме нельзя размещать новые ответы.

Provokator86

Мой дом здесь!
Регистрация
27 Май 2012
Сообщения
365
Реакции
237
Добрый день.
Сегодня в задаче попался интересный(во всяком случае для меня) фрагмент кода с echo, а именно
Код:
echo 1 . print(2) . 1;
Так вот, результат его выполнения 2111. Знатоки, внимание вопрос:
Как?
 
Вначале выполняются операции присваивания - а там вызывается функция print -
Скрипт сразу напечатает 2.
Функция принт возвращает 1 после своего выполнения, то есть остаётся
echo 1.(1).1;
Вот и получается 2111
<-------------- добавлено через 86 сек. -------------->
для лучшего понимания

Код:
function a(){
echo '!a!';

return 'b';
}

echo 1.a().1;
 
А можно узнать, где такие задачи есть, а то есть желание развиваться в изучении PHP
 
Операция присваивания ведь '=' или я где-то, чего-то упустил? А, каким образом принт к ней относится? И почему следующий код выводит результат 311, а не 3111?
Код:
<?php
  function a(){
  print(3);

  }
  echo 1 . a() . 1;
?>
Спасибо.

Сама функция print еще возвращает результат, смотрим тут Для просмотра ссылки Войди или Зарегистрируйся

int print ( string $arg )

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

Таким образом, если полностью сделать правильный вариант, то он будет выглядеть так:

Код:
<?php
  function a(){
    print(3);
    return 1; // добавил возвращаемый результат, можно было написать просто return print(3);

  }
  echo 1 . a() . 1;
?>
 
Вначале выполняются операции присваивания - а там вызывается функция print -
Скрипт сразу напечатает 2.
Функция принт возвращает 1 после своего выполнения, то есть остаётся
echo 1.(1).1;
Вот и получается 2111
<-------------- добавлено через 86 сек. -------------->
для лучшего понимания

Код:
function a(){
echo '!a!';

return 'b';
}

echo 1.a().1;
Операция присваивания ведь '=' или я где-то, чего-то упустил? А, каким образом принт к ней относится? И почему следующий код выводит результат 311, а не 3111?
Код:
<?php
  function a(){
  print(3);

  }
  echo 1 . a() . 1;
?>
<-------------- добавлено через 1579 сек. -------------->
Всё, вник. Всем спасибо за помощь
 
А можно узнать, где такие задачи есть, а то есть желание развиваться в изучении PHP
Приложение Sololearn. Там есть раздел баттлов. Вот в них очень часто попадаются довольно интересные задачи.
<-------------- добавлено через 399 сек. -------------->
Только на собеседованиях для джунов и интернов :) Предназначено для выяснения того, что они хотя бы доки (php.net) прочли.

Вопрос со звездочкой для тех же джунов: что надо изменить в этой строке, чтобы получить 1211, но print(2) должен остаться.
Цитирую с php.net:
echo - это не функция, а конструкция языка, поэтому заключать аргументы в скобки необязательно.
Далее по тексту:
Эта функция не возвращает значения после выполнения.
Меня интересовал только один вопрос: почему не : 1311, а 3111.
Спасибо Киллу и Авроре, всё впитал.
 
А можно узнать, где такие задачи есть, а то есть желание развиваться в изучении PHP
Только на собеседованиях для джунов и интернов :) Предназначено для выяснения того, что они хотя бы доки (php.net) прочли.

Вопрос со звездочкой для тех же джунов: что надо изменить в этой строке, чтобы получить 1211, но print(2) должен остаться.
<-------------- добавлено через 2083 сек. -------------->
Цитирую с php.net:
echo - это не функция, а конструкция языка, поэтому заключать аргументы в скобки необязательно.
Меня интересовал только один вопрос: почему не : 1311, а 3111.
Если внимательно прочитать всю страницу Для просмотра ссылки Войди или Зарегистрируйся там будет ответ на вопрос как правильно использовать echo, чтобы получить 1311 вместо 3111.
 
Без компилятора:
в первом случае 231115
во втором должна ошибка быть - функция без аргументов вызывается с аргументом.
Пойду скомпилю :)
 
Тогда ещё вопрос. Отвечать без компилятора :)
Даже простейший код на php проверяю в компиляторе, ибо плавали знаем...

Результат следующих выражений какой:
Код:
<?php
  echo 1 . print(2) . print(3) . 5;
?>

Прикольно, по всему выходит, что должно быть
Код:
231115
В моём представлении это как-то так работает
PHP:
function far($num) {
  echo $num;
  return 1;
}

echo 1 . far(2) . far(3) . 5;
Это согласно приоритета операций Для просмотра ссылки Войди или Зарегистрируйся

Но фиг там похоже у print своё мнение на этот счёт, и echo там ни при чём:
PHP:
<?php
  print(2) . print(3) . 5;
?>
вернёт
PHP:
3521

А вот если использовать echo c запятыми, на что я намекал в предыдущем посте, то результат гораздо более логичный:
PHP:
echo 1 , print(2) , print(3) , 5;
Код:
121315
 
Последнее редактирование:
Если внимательно прочитать всю страницу Для просмотра ссылки Войди или Зарегистрируйся там будет ответ на вопрос как правильно использовать echo, чтобы получить 1311 вместо 3111.
Тогда ещё вопрос. Отвечать без компилятора :)
Результат следующих выражений какой:
Код:
<?php
  echo 1 . print(2) . print(3) . 5;
?>

Код:
<?php
function a(){
return print 3;
}
  echo 1 . print(2) . a(3) . 5;
?>
<-------------- добавлено через 1374 сек. -------------->
Без компилятора:
в первом случае 231115
во втором должна ошибка быть - функция без аргументов вызывается с аргументом.
Пойду скомпилю :)
Неверно. Нет ошибки. И первый ответ тоже неверно :)
<-------------- добавлено через 2925 сек. -------------->
echo 1 , print(2) , print(3) , 5;
Интересно, у меня выбило синтаксическую ошибку на запятую.
<-------------- добавлено через 1916 сек. -------------->
А вот если использовать echo c запятыми, на что я намекал в предыдущем посте, то результат гораздо более логичный:
Согласен, но в первом случае мы склеили ,а во втором банальное перечисление. Это логично. Но в представленном мной случае я логики не наблюдаю. Даже если мы решим, что поняли замысел echo, print , то вот ещё более непонятная ситуация:
Код:
<?php

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

?>
Вот попробуйте вызвать с одним принтом, после с двумя и на этих данных предсказать, как поведут себя три принта и..... Вы ошибетесь.
В общем один вопрос загрузил меня на пол дня.
Всем спасибо за помощь, буду скрупулезней читать мануалы.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху