«Функция» print

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

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

Я, понятное дело, напишу утрированный случай, чтобы проиллюстрировать проблему. Как думаете, что выведет следующий код?
var_dump(print("xaxa") + 1);
По идее, должна выполниться «функция» print, вывести «xaxa», вернуть «1», которая сложится со второй единицей и var_dump выведет их сумму — «2».

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

hshhhhh (hshhhhh.name)
25 февраля 2014, 18:14

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

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

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

кто-то (инкогнито)
25 февраля 2014, 18:21

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

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

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

кто-то (инкогнито)
25 февраля 2014, 18:28

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

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

тоже кто-то (инкогнито)
25 февраля 2014, 19:23

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

Евгений Степанищев (bolknote.ru)
25 февраля 2014, 20:24, ответ предназначен hshhhhh (hshhhhh.name):

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

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

Евгений Степанищев (bolknote.ru)
25 февраля 2014, 20:25, ответ предназначен кто-то

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

Евгений Степанищев (bolknote.ru)
25 февраля 2014, 21:06, ответ предназначен hshhhhh (hshhhhh.name):

Зачем вообще нужен print() кроме как по историческим причинам, когда echo делает то же самое?
Это две разные конструкции — print можно использовать как функцию, а echo — нет.

hshhhhh (hshhhhh.name)
26 февраля 2014, 02:52, ответ предназначен Евгений Степанищев (bolknote.ru):

Это две разные конструкции — 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)
26 февраля 2014, 02:56, ответ предназначен Евгений Степанищев (bolknote.ru):

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

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

Евгений Степанищев (bolknote.ru)
26 февраля 2014, 06:11, ответ предназначен hshhhhh (hshhhhh.name):

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

return print "что-то";

Евгений Степанищев (bolknote.ru)
26 февраля 2014, 06:20, ответ предназначен hshhhhh (hshhhhh.name):

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

hshhhhh (hshhhhh.name)
26 февраля 2014, 13:21, ответ предназначен Евгений Степанищев (bolknote.ru):

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

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

Евгений Степанищев (bolknote.ru)
26 февраля 2014, 13:57, ответ предназначен hshhhhh (hshhhhh.name):

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

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

кто-то (инкогнито)
26 февраля 2014, 18:05, ответ предназначен Евгений Степанищев (bolknote.ru):

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

Евгений Степанищев (bolknote.ru)
26 февраля 2014, 18:53, ответ предназначен кто-то

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

кто-то (инкогнито)
26 февраля 2014, 20:35, ответ предназначен Евгений Степанищев (bolknote.ru):

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

Евгений Степанищев (bolknote.ru)
27 февраля 2014, 06:25, ответ предназначен кто-то

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

http://blgo.ru/ (инкогнито)
5 марта 2014, 11:36

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

Евгений Степанищев (bolknote.ru)
5 марта 2014, 13:38, ответ предназначен http://blgo.ru/

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

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)