Разница между точкой и запятой при объединении с эхом и возвратом?

Я только что обнаружил, что это будет работать:

echo $value , " continue";

но это не так:

return $value , " continue";

Пока "." работает в обоих.

Чем здесь отличается точка от запятой?


person omg    schedule 23.09.2009    source источник
comment
Этот вопрос слишком широк, потому что у него может быть много вариантов использования, применимых к одному и тому же поведению.   -  person i am me    schedule 03.10.2015


Ответы (7)


return допускает только одно выражение. Но echo позволяет список выражений, где каждое выражение отделяется запятой. Но учтите, что поскольку echo — это не функция, а специальная языковая конструкция, заключение списка выражений в круглые скобки недопустимо.

person Gumbo    schedule 23.09.2009
comment
Хотя и не идеальный, но ближайший! - person omg; 23.09.2009
comment
Однако эхо разрешает круглые скобки, если есть только аргумент - person Juan Mendes; 10.09.2010
comment
@JuanMendes, как из этого следует, какая логика или объяснение тогда? - person Pacerier; 30.03.2015
comment
@Pacerier Скобки будут заключать первое выражение в списке, как вы можете заключить любое выражение в дополнительные скобки. - person Gumbo; 30.03.2015
comment
@Gumbo, Вау, только что понял, что это работает: echo 1,2,(3),4,(5); - person Pacerier; 06.04.2015
comment
Заключение списков выражений в круглые скобки вообще недопустимо: array((1,2,3)) также вызовет ошибку. - person Tgr; 27.08.2015
comment
Это может сбивать с толку людей, пришедших из других C-подобных языков, поскольку в них обычно есть оператор запятой (так что 1,2,3 является допустимым выражением), а в PHP его нет. - person Tgr; 27.08.2015
comment
print является языковой конструкцией, как и echo, но синтаксический анализатор специально не разрешает echo после начала оператора, потому что это не имеет смысла где-либо еще ($echo=1; не считается). print <arg> возвращает 1, поэтому допускается любое значение, даже в круглых скобках. Это может быть полезно для отладки ряда условий, таких как echo $a&&(print 'a')&&$b&&(print 'b')||$c&&(print 'c') ? 1 : 0; //ac1, где, по-видимому, $a и $c были истинными, а $b — нет. Вот еще интересная каша: echo 4,print 3,print 2; //43121. - person Chinoto Vokro; 17.12.2016

Вы также должны отметить, что echo как конструкция быстрее с запятыми, чем с точками.

Итак, если вы присоединитесь к персонажу 4 миллиона раз, вот что вы получите:

эхо $str1, $str2, $str3;

Около 2,08 секунды

эхо $str1 . $стр2 . $стр3;

Около 3,48 секунд

Как вы можете видеть выше, это занимает почти половину времени.

Это связано с тем, что PHP с точками объединяет строку first и затем выводит их, а с запятыми просто выводит их одну за другой.

Речь идет о дробях, но все же.

Исходный источник

person Mr.Web    schedule 03.07.2013
comment
мне нравится твое объяснение. Странно, я много лет программировал на PHP и никогда не знал, что можно разделять запятыми. Я всегда использовал точки. - person azzy81; 17.07.2013
comment
@SubstanceD :D Отлично! - person Mr.Web; 17.07.2013
comment
Источник, поэтому, если кто-то решит продолжить чтение этого electrictoolbox.com/php -эхо-запятые-против-конкатенации - person Brian Leishman; 12.01.2015
comment
@Mr.Web, перестаньте говорить, что это функция, и начните петь сейчас, люди: не функция. Эхо не является функцией. Эхо не является функцией. Эхо — это не функция. - person Pacerier; 30.03.2015
comment
@Pacerier хорошо хорошо! Оооооооооооооооооооооооооооооооооооооооо Я исправил это, мой плохой. - person Mr.Web; 08.12.2015
comment
ob_start(function(){},4000); $past=microtime(true); echo eval('echo '.trim(str_repeat('"123".', 1e5), '.').';'); $time=microtime(true)-$past; ob_end_clean(); echo $time; Если я запущу это, я получу ошибку сегментации, но если я перейду на 1e4 повторения или заменю точку на запятую (в первом аргументе str_repeat и втором аргументе trim), это сработает. Вывод: не объединяйте, если в этом нет необходимости, вместо этого используйте запятые. Пустой буфер вывода предотвращает вывод и ограничивает использование памяти. В этом непристойном бенчмарке запятые в 7 раз быстрее (какой сумасшедший объединяет 10000 значений?!). - person Chinoto Vokro; 17.12.2016
comment
Это может иметь значение, если элементов намного больше, чем 3 (на практике очень часто наблюдается квадратичное поведение - и добавление множества маленьких строк с полной копией строки для каждой маленькой строки имеет имя: Алгоритм художника Шлемиэля) - person Peter Mortensen; 11.11.2019
comment
Ожидается, что echo $str1; эхо $str2; эхо $str3; также будет около 2,08 секунды в приведенной выше настройке? - person user3445853; 28.11.2019

. — это оператор конкатенации в PHP для объединения двух строк.

Запятая может использоваться для нескольких входов в echo.

person GSto    schedule 23.09.2009
comment
Итак, запятая - это оператор конкатенации только для эха? - person omg; 23.09.2009
comment
в этом отношении это не конкатенация, это просто «список» переменных или укусов для эхо... - person NDM; 23.09.2009
comment
Нет, запятая создает список выражений для использования эхом, эхо объединяет список, когда печатает его в одной строке. - person acrosman; 23.09.2009
comment
Но кронштейна нет вообще. - person omg; 23.09.2009
comment
echo — это не вызов функции, а языковая конструкция. Языковые конструкции в PHP могут вызываться как с круглыми скобками, так и без них. - person Alex Barrett; 23.09.2009

Точка (.) предназначена для конкатенации переменной или строки. Вот почему он работает, когда вы повторяете при объединении двух строк, и он работает, когда вы возвращаете конкатенацию строки в методе. Но запятая не объединяется, и поэтому оператор return не будет работать.

echo — это языковая конструкция, которая может принимать несколько выражений, поэтому запятая работает:

void echo ( string $arg1  [, string $...  ] )

Используйте точку для конкатенации.

person Patrick Desjardins    schedule 23.09.2009
comment
Но я использую эхо «что-то», а не эхо («что-то»), скажем, без скобок. - person omg; 23.09.2009
comment
PHP поддерживает концепцию переменных функций. Это означает, что если к имени переменной добавлены круглые скобки, PHP будет искать функцию с тем же именем, что и значение переменной, и попытается ее выполнить. Помимо прочего, это можно использовать для реализации обратных вызовов, таблиц функций и т. д. - person Patrick Desjardins; 23.09.2009
comment
это потому, что echo является ключевым словом в PHP, в дополнение к функции. вы можете написать это как echo('что-то','что-то еще'), и это тоже будет работать нормально. - person GSto; 23.09.2009
comment
Берег, вы должны проверить веб-сайт php.net об эхе. Мы с GSto говорим вам в точности то, что написано в документации PHP. И это работает. - person Patrick Desjardins; 23.09.2009
comment
эхо('что-то','что-то еще'); выход(); Ошибка синтаксического анализа: синтаксическая ошибка, неожиданное ',' - person omg; 23.09.2009
comment
нельзя использовать круглые скобки при передаче нескольких параметров. В любом случае никто не использует его со скобками. - person Juan Mendes; 10.09.2010
comment
The echo is a function - нет. Смотрите ответ ниже от @knittl - person scrowler; 19.06.2014
comment
@PatrickDesjardins, echo не является функцией. echo не является функцией. echo не является функцией. echo не является функцией. Прочтите документы, да php.net/echo. echo на самом деле не является функцией (это языковая конструкция), поэтому вам не нужно использовать с ней круглые скобки. Кроме того, если вы хотите передать в эхо более одного параметра, параметры не должны заключаться в круглые скобки.. И почему вы говорите, что это работает, когда все из нас получают уведомление PHP: попытка получить свойство не-объекта в файле.php в строке 2? - person Pacerier; 30.03.2015

echo — это языковая конструкция (не функция) и может принимать несколько аргументов, поэтому , работает. использование запятой будет немного четным (но только несколько наносекунд, не о чем беспокоиться)

. — это оператор конкатенации (клей) для строк

person knittl    schedule 23.09.2009

echo на самом деле является функцией (не совсем, но, скажем, ради аргумента), которая принимает любое количество параметров и объединит их вместе.

Хотя return — это не функция, а скорее ключевое слово, которое сообщает функции вернуть значение, а , пытается интерпретировать как некий оператор. Вы должны использовать . в качестве оператора конкатенации в случае, когда вы используете оператор return.

person Kibbee    schedule 23.09.2009
comment
Не функция. - person Pacerier; 30.03.2015

Стоит отметить, что оператор конкатенации . имеет более высокий приоритет, чем многие другие операторы, и имеет такой же приоритет, как операторы + и -.

Почему это важно?

Что ж, говорить дешево, позвольте мне показать вам код (из документация по PHP< /а>)

$x = 4;
// this line might result in unexpected output:
echo "x minus one equals " . $x-1 . ", or so I hope\n";
// because it is evaluated like this line:
echo (("x minus one equals " . $x) - 1) . ", or so I hope\n";
// the desired precedence can be enforced by using parentheses:
echo "x minus one equals " . ($x-1) . ", or so I hope\n";

Фактически, первая строка выдаст сообщение об устаревании, начиная с PHP 7.4.0.

Устарело: поведение выражений без скобок, содержащих оба '.' и '+'/'-' изменятся в PHP 8: '+'/'-' будет иметь более высокий приоритет

Таким образом, в PHP 8 кажется, что проблема ассоциативности в этом случае будет решена путем предоставления операторам + и - более высокого приоритета.

Можем ли мы сейчас сказать, что . и , при использовании эха дают одинаковый результат?

Нет, они не всегда будут давать одинаковый результат

Возьмем, к примеру, этот случай

echo ' Here\'s ' . $name ?? 'Johnny';

Здесь мы использовали Нулевой оператор объединения, поэтому, если $name существует и не равно NULL, он будет возвращен, иначе он вернет Johnny. На первый взгляд может показаться, что результатом будет А вот и Джонни, поскольку $name не определено, по крайней мере, они на это надеются.

На самом деле результат будет

PHP Notice:  Undefined variable: name
Here's 

Здесь произошло то, что оператор ?? имеет более низкий приоритет, чем ., что означает, что PHP сначала попытается оценить (здесь $name).

Вы можете решить эту проблему, заключив выражение в круглые скобки

echo ' Here\'s ' . ($name ?? 'Johnny');

Или просто используйте запятую.

echo ' Here\'s ' , $name ?? 'Johnny';
person Rain    schedule 05.02.2020
comment
Столько ценной информации в вашем комментарии! :) - person Daniel; 03.05.2021