Разница между точкой и запятой при конкатенации с эхо против возврата?
Я только что обнаружил, что это будет работать:
echo $value , " contiue";
но это не
return $value , " contiue";
В то время как "." Работает в обоих.
Какая разница между точкой и запятой здесь?
9 ответов
return
допускает только одно выражение. Но echo
позволяет список выражений, где каждое выражение разделено запятой. Но обратите внимание, что с echo
это не функция, а специальная языковая конструкция, завершение списка выражений в скобках недопустимо.
Вы также должны отметить, что echo
как конструкция быстрее с запятыми, чем с точками.
Поэтому, если вы присоединитесь к персонажу 4 миллиона раз, вы получите следующее:
echo $ str1, $ str2, $ str3;
Около 2,08 секунд
echo $str1 . $str2 . $ Str3;
Около 3,48 секунды
Это связано с тем, что PHP с точками сначала присоединяется к строке, а затем выводит их, а с запятыми просто выводит их один за другим.
.
является оператором конкатенации в PHP, для объединения двух строк. Запятая может использоваться для нескольких входов, чтобы повторить.
Точка (.
) предназначен для объединения переменной или строки. Вот почему он работает, когда вы получаете эхо при конкатенации двух строк, и работает, когда вы возвращаете конкатенацию строки в методе. Но запятая не объединяется, и поэтому оператор return не будет работать.
echo
это языковая конструкция, которая может принимать несколько выражений, поэтому запятая работает:
void echo ( string $arg1 [, string $... ] )
Используйте точку для объединения
echo
является языковой конструкцией (не функцией) и может принимать несколько аргументов, поэтому ,
работает. использование запятой будет немного равномерным (но только несколько наносекунд, не о чем беспокоиться)
.
является оператором конкатенации (клей) для строк
echo
на самом деле это функция (не совсем, но, скажем, для аргумента), которая принимает любое количество параметров и объединяет их вместе.
В то время как return
это не функция, а ключевое слово, которое сообщает функции, чтобы она возвращала значение, и она пытается интерпретировать ,
как какой-то оператор. Вы должны использовать .
в качестве оператора конкатенации в случае, когда вы используете оператор возврата.
Стоит отметить, что оператор конкатенации .
имеет более высокий приоритет, чем многие другие операторы, и имеет равный приоритет с +
а также -
операторы
Почему это важно?
Что ж, разговоры дешевы, позвольте мне показать вам код (из документации 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';
Здесь мы использовали оператор объединения Null, поэтому, если $name существует и не равно NULL, он будет возвращен, в противном случае он вернет Johnny. На первый взгляд может показаться, что результатом будет вот Джонни, поскольку $name не определено, или они надеются на это.
Собственно результат будет
PHP Notice: Undefined variable: name
Here's
Здесь произошло то, что ??
оператор имеет более низкий приоритет, чем .
что означает, что PHP сначала попытается оценить (здесь $name).
Вы можете решить эту проблему, заключив выражение в круглые скобки
echo ' Here\'s ' . ($name ?? 'Johnny');
Или просто используйте запятую.
echo ' Here\'s ' , $name ?? 'Johnny';
Есть еще одно интересное отличие. Согласно ответу @phirschybar на этот вопрос, если вы используете запятые в сочетании с html<pre>
вы получаете результат, который поддерживает разрывы строк. Это полезно для просмотра форматированного объекта. Например, для данного объекта:
$object = new stdClass();
$object->property = 'test value';
Использование конкатенации...
echo "<pre>" . var_dump($object) . "</pre>";
... вы не получаете разрывов строк, что затрудняет чтение большого объекта:
object(stdClass)#1 (1) { ["property"]=> string(10) "test value" }
Но с помощью запятых...
echo "<pre>" , var_dump($object) , "</pre>";
... вы получаете разрывы строк для удобства чтения:
object(stdClass)#1 (1) {
["property"]=>
string(10) "test value"
}
В отличие от ответа Mr.Web, PHP в 2022 году работает быстрее с точками.
$ cat test.php
<?php
$iterations = 10000;
$file_out ="./benchmark";
$precision = 8;
function dot()
{
echo "Hello" . "World\n";
}
function comma()
{
echo "Hello" , "World\n";
}
$begin = hrtime(true);
for ( $i=0 ; $i<$iterations; $i++) {
dot();
}
$end = hrtime(true);
$out = " dot: " . round($end-$begin, $precision)."\n";
file_put_contents($file_out, $out, FILE_APPEND);
$begin = hrtime(true);
for ( $i=0 ; $i<$iterations; $i++) {
comma();
}
$end = hrtime(true);
$out = " comma: " . round($end-$begin, $precision)."\n";
file_put_contents($file_out, $out, FILE_APPEND);
$ php test.php
...snip...
$ cat benchmark
dot: 22893557
comma: 29056406