Я сделал небольшую функцию ( 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!