Объединение синтаксиса ECHO в PHP - PullRequest
13 голосов
/ 13 ноября 2011

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

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

Ответы [ 5 ]

24 голосов
/ 13 ноября 2011

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

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

Надеюсь, это понятнее. Опубликуйте, если нет.

7 голосов
/ 13 ноября 2011

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

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

1 голос
/ 11 мая 2016

Как будущая памятка для меня:

$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!
1 голос
/ 13 ноября 2011

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

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

кажется, что вы смешиваете 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);
0 голосов
/ 13 ноября 2011

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

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

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

...