Пишу, по большей части, про историю, свою жизнь и немного про программирование.

«Функция» print

Одним из распространённых заблуждений программистов на ПХП является то, что конструкция print является, якобы, функцией. На самом деле никакая она не функция — ей даже скобки не нужны, чтобы работать. Но с функцией print роднит то, что при вызове в составе выражения она всегда возвращает «1».

Весь ужас этого заблуждения как раз в использовании этой конструкции со скобками. Я программирую на ПХП уже около 15 лет, но всего пару раз за это время видел как это заблуждение рождает проблемы, но зато какие!

Я, понятное дело, напишу утрированный случай, чтобы проиллюстрировать проблему. Как думаете, что выведет следующий код?

var_dump(print("xaxa") + 1);

По идее, должна выполниться «функция» print, вывести «xaxa», вернуть «1», которая сложится со второй единицей и var_dump выведет их сумму — «2».

Как бы не так! На самом деле, с точки зрения конструкции print (которой не нужны скобки) ей передали аргумент «(„xaxa“) + 1». При их складывании левая часть преобразуется к числу и получается «0», сумма нуля и единицы — «1», вот print его и напечатает, потом вернёт единицу, которую напечатает var_dump.

19 комментариев
hshhhhh (hshhhhh.name) 2014

echo тоже не нужны скобки, но я их всегда пишу.

Но вот зачем писать var_dump(print()) ? Не понимаю.

Зачем вообще нужен print() кроме как по историческим причинам, когда echo делает то же самое?

кто-то 2014

Вот уже 10 лет как на php пишу. И никогда с print дела не имел.

А вообще есть очень простые правила.

  1. Если не хотите проблем с PHP, то пишите на PHP так как будто это Java/C#.
  2. Если не хотите проблем с Java/C#, то пишите на них так, как будто это С++.
  3. Не хотите проблем с C++ пишите так, как будто это Assembler.

И тогда мир расцветет всеми красками, и лев ляжет с ягненком, и женщины перестанут симулировать для вас оргазм...

кто-то 2014

Продолжая цепочку...

  1. А на Assembler надо писать так, будто вы собираетесь перепаять работающую под напряжением плату.

Но этим я никогда не занимался.

тоже кто-то 2014

поэтому, если размотать всю логическую цепочку в обратном направлении, десять лет говнокодишь на пхп? :)

Евгений Степанищев (bolknote.ru) 2014

Комментарий для hshhhhh.name:

Пишешь-пишешь, что это пример для иллюстрации, а никто не читает. Причём каждый раз так — спрашивают зачем использовать в точности твк как в примере.

Да нечем, там же написано, что так проще проблему проиллюстрировать!

Евгений Степанищев (bolknote.ru) 2014

Комментарий для кто-то:

Вас обманули, не надо так делать.

Евгений Степанищев (bolknote.ru) 2014

Комментарий для hshhhhh.name:

Зачем вообще нужен print() кроме как по историческим причинам, когда echo делает то же самое?

Это две разные конструкции — print можно использовать как функцию, а echo — нет.

hshhhhh (hshhhhh.name) 2014

Комментарий для Евгения Степанищева:

Это две разные конструкции — print можно использовать как функцию, а echo — нет.

Так не работает:

php > $f = ’print’;
php > $f(’test’);
PHP Fatal error: Call to undefined function print() in php shell code on line 1
Fatal error: Call to undefined function print() in php shell code on line 1

И так не работает:

php > call_user_func(’print’, ’test’);
PHP Warning: call_user_func() expects parameter 1 to be a valid callback, function ’print’ not found or invalid function name in php shell code on line 1
Warning: call_user_func() expects parameter 1 to be a valid callback, function ’print’ not found or invalid function name in php shell code on line 1

Так как же мне юзать print() как функцию? echo(’test’) никто не запрещает же делать. Я что-то не очень понимаю %)

hshhhhh (hshhhhh.name) 2014

Комментарий для Евгения Степанищева:

Да нечем, там же написано, что так проще проблему проиллюстрировать!

Дело не в том что я не понимаю что это пример, а в том что это самое реалистичное использование print() которое я видел за свою жизнь :)

printf(), без вопросов, полезное, а вот print()...

Евгений Степанищев (bolknote.ru) 2014

Комментарий для hshhhhh.name:

Ну конечно не работает, функции print нет же. print можно использовать в выражениях, а echo — нет. В этом разница. Особо полезным это не назовёшь, но примеры использования я видел.

Дело не в том что я не понимаю что это пример, а в том что это самое реалистичное использование print() которое я видел за свою жизнь :)

Я редко видел примеры использования print, но они были. Не сказать, чтобы print там была необходима, просто использовалась. Например, что-то вроде

return print «что-то»;

Евгений Степанищев (bolknote.ru) 2014

Комментарий для hshhhhh.name:

Если всё это обсуждение сводится к вопросу есть ли какие-то ситуации, где необходимо использовать print, то нет, я таких ситуаций не знаю. Разве только изнутри какого-то выражения вывести промежуточный вариант в целях отладки.

hshhhhh (hshhhhh.name) 2014

Комментарий для Евгения Степанищева:

Если всё это обсуждение сводится к вопросу есть ли какие-то ситуации, где необходимо использовать print, то нет, я таких ситуаций не знаю. Разве только изнутри какого-то выражения вывести промежуточный вариант в целях отладки.

Ну как бы да, я про это.

Я понимаю что и print, и echo -​-​ это языковые конструкции, а не функции. Но я не понимаю проблемы с print() потому что решение очень простое: не надо им пользоваться и надо не быть идиотом :).

return print «что-то»;

Ну я даже не знаю. Убивать за идиотизм? :)

Евгений Степанищев (bolknote.ru) 2014

Комментарий для hshhhhh.name:

Человек строку сэкономил. :)

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

кто-то 2014

Комментарий для Евгения Степанищева:

А в чем плох мой подход, согласно которому вместо того, чтобы использовать все возможности языка, позволяющие нарваться на большие проблемы (причем практически любому программисту не являющегося экспертом именно в этом языке), мы искуственно на уровне внутренних стандартов компании ужесточаем стиль программирования?

Евгений Степанищев (bolknote.ru) 2014

Комментарий для кто-то:

Ничем, пока приходится иметь дело с кодом только внутри компании и работать в компаниях где все этот подход принимают.

кто-то 2014

Комментарий для Евгения Степанищева:

А из всех остальных компаний надо бежать.
Поскольку в силу низких требований к качеству разработки там и рейты соответствующие, и народ не тот, и компания эксплуатирует тебя, а не ты компанию.

Евгений Степанищев (bolknote.ru) 2014

Комментарий для кто-то:

Ну тогда вы сбежали бы из «Яндекса», например, а там было замечательно :)

blgo.ru/ 2014

С print’ом пример натянут, а вот более жизненный пример на ту же тему:
$x = include(«value.php») + 1;

Евгений Степанищев (bolknote.ru) 2014

Комментарий для http://blgo.ru/:

Куда он натянут? Это то, что я в жизни встречал. В вашем примере смысла куда больше, но его, как раз, я не встречал ни разу в жизни.