почему при использовании функции «эхо» результат отображается в предыдущей строке?

Я написал функцию, которая выводит идентификатор на другой стороне связанной таблицы.

когда я пишу на странице, которая вызывает функцию--

echo "<br/>getalbumartistfunction: ".get_albumartistid($thisalbum);

он возвращает номер artist_id в строке выше, где у меня есть вызов этой функции. Итак, я вошел в функцию и переключил ее с «эхо» на «возврат», и теперь она появляется сразу после двоеточия, как я и ожидал (и, вероятно, больше соответствует тому, что мне нужно).

Так что это работает. Но я очень смущен, почему он показывает результат в предыдущей строке, когда функция настроена на его эхо.


person Damon    schedule 12.12.2010    source источник
comment
потому что эта функция, очевидно, вызывается до того, как вся строка будет собрана.   -  person Your Common Sense    schedule 12.12.2010
comment
@Eineki, тебе просто нужно больше знаний.   -  person Your Common Sense    schedule 12.12.2010
comment
Деймон, представь, у тебя есть немного денег в кармане и немного в кошельке. Чтобы что-то купить, нужны деньги от обоих. Но каждый раз, когда вы берете бумажник, вы отдаете деньги непосредственно продавцу. Итак, прежде чем вы заберете деньги и из кармана, и из кошелька, вы уже отдали свои деньги из кошелька. Вот почему не следует никогда ничего выводить из функции, если только это не специальная функция вывода.   -  person Your Common Sense    schedule 12.12.2010


Ответы (5)


Эхо в get_albumartistid выполняется немедленно, когда вызывается функция, в то время как эхо "
..." собирает строку перед ее эхом - по сути, буферизуя все это перед тем, как оно будет эхо. Возврат вместо эха - правильный способ справиться с этим, поскольку это эффективно заменит вызов функции возвращаемой строкой. Если бы вы использовали эхо, вам нужно было бы:

echo "<br/>getalbumartistfunction: ";
get_albumartistid($thisalbum);

Что эффективно становится:

echo "<br/>getalbumartistfunction: ";
echo "<The artist id>";

В вашем исходном примере этот порядок выполнения делает это:

echo "<The artist id>";
echo "<br/>getalbumartistfunction: ";

Поскольку все эхо-сигналы происходят сразу же, когда они вызываются, и PHP не выполняет буферизацию вашего внешнего эхо-оператора.

person methodin    schedule 12.12.2010

Поскольку аргумент для echo должен быть известен до вызова echo, функция get_albumartistid вызывается раньше. Таким образом, любой оператор внутри функции также вызывается перед echo. Вот почему echo внутри функции будет выводить данные раньше, чем echo вне функции.

person Gumbo    schedule 12.12.2010

Поскольку функция get_albumartistid оценивается до вывода всего эха, то есть эхо внутри get_albumartistid выполняется до echo "<br/>getalbumartistfunction: ".

person Tatu Ulmanen    schedule 12.12.2010

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

  1. PHP встречает внешний оператор echo. Он начинает создавать строку для отправки в выходной буфер. Первое, что он видит, это строка "<br/>getalbumartistfunction: ". Следующим, присоединенным к предыдущей строке, является вызов функции get_albumartistid(). Он должен оценить вызов этой функции, чтобы завершить оценку конкатенации, поэтому...
  2. PHP выполняет функцию get_albumartistid(). Эта функция содержит оператор echo. Содержимое оператора echo отправляется в выходной буфер. Функция возвращает null.
  3. Функция вернула null, поэтому PHP объединяет null с предыдущей строкой (оставляя ее неизменной).
  4. Строка во внешнем echo завершена, и echo готово к возврату. Он отправляет строку в выходной буфер.
person Hammerite    schedule 12.12.2010

Выражение против порядка выполнения.

Ваш echo "string" . get() приводит к следующему потоку выполнения:

  • PHP объединяет выражение, следующее за echo. Эхо еще не может быть выполнено.
  • Первая строка в конкатенации является статической.
  • Чтобы получить вторую строку, необходимо вызвать функцию. Когда функция делает что-то смешное (пердит или распечатывает что-то), она делает это сразу же в этот момент.
  • Две части строки объединяются в новую временную строку.
  • Только теперь эхо может выводить все.
person mario    schedule 12.12.2010