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

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

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
Другие вопросы по тегам