Конкатенация синтаксиса 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>'; 

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

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

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

Это не приведет к большому вмятину в скорости для большинства приложений, но я вообще привык использовать запятые для echo любом случае.

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


EDIT: Теперь, вот почему вещи «не в порядке». (Извиняюсь перед всеми, поскольку я только что понял, что это был коренной вопрос все время.) Когда вы 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() , который имеет свой собственный вывод и ничего не возвращает, поэтому для него ничего не выводится.

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

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

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

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

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

кажется, вы смешиваете 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); 

Ну, оффтопик для борьбы с оффтопом Брэда.

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

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

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

 $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!