Подтвердить что ты не робот

Конкатенация синтаксиса ECHO в PHP

Я сделал небольшую функцию (WordPress), используя echo .

/* .. Some code */
switch ($linktype) {
    case "next":
        echo '<p class="next">' . previous_post_link('%link',''.$prevthumbnail.'') . '</p>';
        break;
    case "prev":
        echo '<p class="prev">' . next_post_link('%link',''.$nextthumbnail.'') . '</p>';
        break;
}
/* .. Some other code*/

Используя "регулярный" синтаксис конкатенации, который я знаю...

echo '<p class="next">'. previous_post_link('%link',''.$prevthumbnail.'') . '</p>';

... производит...

<p class="next"></p>< result of previous_post_link() >

Мне явно нужно <p class="next">< result of previous_post_link() ></p>. Я нашел несколько сообщений, предлагающих заменить точки ('.') запятыми (','), поэтому теперь у меня есть...

echo '<p class="next">' , previous_post_link('%link',''.$prevthumbnail.'') , '</p>';

... который работает. Является ли это "правильным" способом решения проблемы, или это просто "хак", который работает? Есть ли лучший подход?

4b9b3361

Ответ 1

Запястья быстрее.

Конструкция echo допускает несколько "параметров". Когда вы echo с запятыми, выход отправляется прямо в буфер по частям. Когда вы используете ., он должен сначала соединить.

В большинстве случаев это не приведет к огромной вмятине, но обычно я привык использовать запятые для echo.

Вот вам бенчмарк, если вам интересно: http://www.electrictoolbox.com/php-echo-commas-vs-concatenation/


РЕДАКТИРОВАТЬ: Теперь, почему вещи "вышли из строя". (Извиняюсь перед всеми, поскольку я только что понял, что это был коренной вопрос все время.) Когда вы echo с ., вы сначала объединяетесь, прежде чем echo будет выполнять свою работу. Для этого каждое выражение сначала оценивается. Рассмотрим это:

echo (5+5) . (10+10);

PHP сначала оценит (5+5), а затем (10+10). Это эквивалентно превращению его в это:

echo 10 . 20;

И тогда они нуждаются в конкатенации, поэтому они преобразуются в строки и становятся такими:

echo "1020";

Это имеет смысл? Теперь рассмотрим функцию previous_post_link(). @Tim совершенно правильно, что от этой функции нет возвращаемого значения. Когда эта функция оценивается, она ничего не возвращает и ничего эхо. Поэтому, если мы это сделаем:

echo "test" . previous_post_link();

Во-первых, обе вещи оцениваются. "test" уже является строкой, но сначала нужно запустить функцию previous_post_link(), чтобы получить ее возвращаемое значение для конкатенации. Когда побежал, previous_post_link() выводит что-то и ничего не возвращает. "test" затем объединяется ни с чем, и эта конкатенация выводится через echo.

Теперь предположим, что вместо этого мы используем запятые:

echo "test", previous_post_link();

PHP оценивает все "параметры" для конструкции echo по порядку и выводит их. Сначала выводится "test", а затем вычисляется previous_post_link(), у которого есть собственный вывод, и ничего не возвращает, поэтому для него ничего не выводится.

Надеюсь, это яснее. Сообщение, если нет.

Ответ 2

Проблема в том, что функция WordPress previous_post_link('%link',''.$prevthumbnail.'') действительно имеет встроенную встроенную команду печати, и она печатает после эха завершает печать.

Если вы хотите использовать эту команду в эхо (или сохранить строку), вы должны использовать get_previous_posts_link, который вместо печать значения возвращает его.

Ответ 3

все, что должно быть ОЦЕНЕННО каким-то образом (выражение, функция), неизбежно "толкается" до конца при использовании точек?

Я не могу воспроизвести это поведение. И, по моим сведениям, это должно быть противоположным: значения эхо (не оцениваются) сначала идут, а затем идут результат эха.

Кажется, вы смешиваете 2 вопроса - оценку и эхо.
при конкатенировании все выражения оцениваются поочередно:

function aplus($b){
  global $a;
  $a += $b;
}

$a=1;

echo $a."|".aplus(1).$a."||".aplus(1).$a;

тогда как если у вас неправильная практика смешивания эха с операторами, имеющими собственный вывод, это отдельное эхо идет первым:

function e($s){
  echo $s;
}

$a=1;

echo $a."|".e($a +1)."||".e($a+2);

Ответ 4

Ну, оффтопик, чтобы противостоять Брэду offtopic.

Он говорит, что запятые быстрее.
Это просто неправда, а также неправда сказать, что один новый автомобиль дешевле другого, если он стоит на 2 цента меньше. Существуют тысячи отличий - обслуживание, подарки, даже расстояние до магазина и т.д. - разница в 2 цента абсолютно ничтожно. Разумный покупатель не учитывал бы разницу в 2 цента любыми способами.
То же самое здесь.

Этот ответ просто обманывает и заставляет вас думать неправильно. Wordpress является одним из самых медленных приложений в мире. И если кто-то действительно хочет ускорить его,, им нужно сделать много работы по профилированию и оптимизации скорости. Изменение запятых на точки не будет в этом количестве.
Это точка: один узнает, что запятые быстрее и думает: "Я пишу быстрый код!!!" в то время как это совершенно неправильно. Во-первых, сам код всегда быстр. Я манипулирую данными, что делает ваш код медленным! Скажем, Wordpresss анализирует и загружает в память каждый битмаг данных локализации каждый раз, когда он звонит! Помещение этих данных в некоторый кеш сделает ваш Wordpress в 2 раза быстрее! Это то, что я "сделал бы привычкой".
Хотя даже если вы измените ВСЕ точки в коде на запятые, вы никогда не сможете измерить разницу. Реальная разница, а не искусственная. Это особенно применимо к echo, поскольку никакое здравомыслящее приложение не будет использовать эхо в миллион раз.

Ответ 5

Будущая записка для меня:

$squarer = function ($x) { $out = $x*$x; echo "done!\n"; return $out; };

echo 'The square of 2 is ' . $squarer(2) . "!\n";
echo 'The square of 2 is ', $squarer(2), "!\n";

// **** OUTPUT ****
// done!
// The square of 2 is 4!
// The square of 2 is done!
// 4!