Переменная PHP не работает в heredoc при добавлении 6-го

Три недели назад я написал здесь документ, который прекрасно работал, и до сегодняшнего дня в нем использовалось пять переменных PHP.

Вот вот документ:

   echo <<<itemDetails_HEREDOC
   <img src="$sitePath/images/logo-landing2.png" />
   <form action="$thisFilename" method="post" name="arti-form" id="arti-formId">
      <label style="display: inline-block; width: 140px">OWNER NAME:</label><input type="text" style="width: 300px"
           id="ownerId" name="ownerName" readonly="readonly" value="$theLoggedInUser" /><br />
      <label style="display: inline-block; width: 140px">THE ITEM:</label><input type="text"  style="width: 300px"
          readonly="readonly" id="itemNameId" name="itemName" value="$itemName" /><br />
      <label style="display: inline-block; width: 140px">LINK:</label><input type="text"  style="width: 300px"
          readonly="readonly" id="itemLinkId" name="link" value="$theLinkID" /><br />
      <label style="display: inline-block; width: 140px">ERA:</label><input type="text"  style="width: 70px"
          readonly="readonly" id="itemEraId" name="itemEra" value="$itemEra" /><br />
itemDetails_HEREDOC;

В приведенном выше документе есть шесть (6) переменных PHP. Первый ($sitePath) не работает. Я только сегодня добавил.

По какой-то причине сервер не заменяет '$sitePath' (первая переменная PHP в моем heredoc) правильно, потому что, когда браузер получает указанную выше страницу, генерируется ошибка:

  Notice: Undefined variable: sitePath in C:\xampp\htdocs\Arti-facks\showItem.php on line 221

Вот пять переменных PHP, которые были в этом документе и отлично работали в течение трех недель — они правильно заменяются своими значениями до HTML-кода, отправленного в мой браузер:

  • $thisFilename
  • $ theLoggedInUser
  • $itemName
  • $theLinkID
  • $itemEra

Откуда мне знать, что вышеуказанные переменные PHP правильно разрешаются на сервере, а связанные с ними значения помещаются в heredoc, а затем отправляются в браузер?

Просто — я делаю «просмотр исходного кода страницы» и вместо того, чтобы видеть «$ thisFilename» или «$ itemName» и т. д. в HTML-коде, отправленном сервером, — вместо этого я вижу их связанные значения в приведенном выше HTML-содержимом heredoc. .

Например, исходный код страницы показывает мне, что «$thisFilename» в этом документе правильно преобразован в «showItem.php».

Мой '$sitePath' объявлен в глобальном включаемом файле с именем "globals.php", и в этом файле $sitePath объявлен следующим образом:

  $sitePath = "http://localhost/Arti-facks";

И в верхней части showItem.php у меня в течение последних трех недель был этот оператор include для извлечения globals.php:

  require_once 'globals.php'; // Variables and statics used throughout

Итак, сегодня я добавил объявление $sitePath (выше) внутри globals.php.

Чтобы доказать, что showItem.php может «видеть» недавно объявленный $sitePath, который я добавил в globals.php, я повторяю эту переменную — действительно, showItem.php на 100% способен «видеть» мой недавно объявленный $ путь к сайту.

И все же -- несмотря на это -- и несмотря на три недели использования приведенного выше документа с его пятью другими PHP-переменными -- документ не получение $sitePath.

Когда я «просматриваю исходный код страницы», вот что я вижу для строки $sitePath в приведенном выше документе:

    <img src="/images/logo-landing2.png" />

Вы можете видеть, что часть $sitePath перед файлом /images/logo-landing2.png пуста или отсутствует.

Почему я в течение трех недель без проблем получал пять успешно разрешенных переменных PHP в приведенном выше документе, а сегодня я добавляю шестую переменную PHP, и это как

«Боже мой, ваша квота на PHP-переменные в вашем heredoc была исчерпана до 5. И теперь мы видим, что вы пытаетесь использовать шестую PHP-переменную — о чем вы думали».


person wantTheBest    schedule 08.03.2012    source источник
comment
Возможно, этот HEREDOC создан внутри функции? В этом случае глобальный $sitePath выходит за рамки.   -  person Michael Berkowski    schedule 08.03.2012
comment
@Michael, +1 там, вау - да, heredoc находится внутри функции php. И 5 других переменных php, которые нормально работают уже 3 недели, находятся в функции с heredoc. У меня в том же файле globals.php их много: class Labels { static public $USERNAMELABEL = Username; } и я могу без проблем использовать синтаксис типа Labels::$USERNAMELABEL внутри php-функций, и все же класс 'Labels' объявлен прямо рядом с моим $sitePath в globals.php в той же области действия файла . Почему это так и как мне сделать $sitePath видимым в функции php?   -  person wantTheBest    schedule 08.03.2012


Ответы (1)


Поскольку HEREDOC вызывается внутри функции, глобальная переменная $sitePath не входит в область действия. В верхней части функции используйте ключевое слово global:

function yourfunction() {
  global $sitePath;

  // Then build the HEREDOC
}

Или используйте массив $GLOBALS внутри HEREDOC:

echo <<<itemDetails_HEREDOC
   <img src="{$GLOBALS['sitePath']}/images/logo-landing2.png" />   
   <form action="$thisFilename" method="post" name="arti-form" id="arti-formId">
      ...snip...

itemDetails_HEREDOC;

Наиболее предпочтительный: параметр функции

Или, что предпочтительнее перед любым вариантом, передайте переменную $sitePath в функции, которым она нужна в качестве параметра.

function yourfunction($sitePath) {
  // now $sitePath is in scope without 
  // reaching into the global namespace
}
person Michael Berkowski    schedule 08.03.2012
comment
Я объявил внутри функции 'global $sitePath' (меньше печатать), и БАМ, теперь это работает - спасибо. Вопрос -- в том же файле globals.php, где я объявляю $sitePath в глобальном масштабе -- я также объявил это: class Labels { static public $USERNAMELABEL = Username; } и мне не нужно использовать квалификатор 'global' внутри функции, которую я могу использовать: $foo = Labels::$USERNAMELABEL, и это работает нормально, даже несмотря на то, что метки ::$USERNAMELABELS находится в той же глобальной области видимости файла, что и мой $sitePath? - person wantTheBest; 08.03.2012
comment
@wantTheBest Чтобы использовать глобальное значение в функции, вам всегда нужно использовать ключевое слово global в каждой функции (или вместо этого использовать $GLOBALS[], как я предпочитаю, или изменить функцию для получения переменной в качестве параметра) - person Michael Berkowski; 08.03.2012
comment
Labels::$USERNAMELABEL не нуждается в global, потому что его часть Labels:: определяет область его действия. Поэтому двусмысленности нет. На самом деле :: известен как оператор области действия. - person Michael Berkowski; 08.03.2012