Можно ли использовать функции php внутри heredoc?

Можно ли использовать функции в шаблоне heredoc, не нарушая его?
Примерно так:

<<<HTML
<div> showcaptcha(); </div>
HTML;

В частности, я хочу требовать другой шаблон в этом без использования переменных.
Или есть другое и более простое решение, которое не использует heredoc?
Спасибо в продвинутом.

Например я использую класс с именем требует.

class requires {

public function __construct(){
$this->MYSQL();
$this->FUNC();
}

public function MAIN_MENU() {
require_once ('main-menu.tpl');
}

}

Тогда что я делаю в index.php

require_once ('requires.php');
$req = new requires();

echo <<<HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>

//bla bla

</head>
<nav><ul class="fancynav">
{$req->HEAD_SCRIPTS()}
</ul></nav>
HTML;

Основной-menu.tpl

<li><a href="">Item</a></li>
<li><a href="">Item</a></li>
<li><a href="">Item</a></li>
<li><a href="">Item</a></li>
<li><a href="">Item</a></li>

И в результате у меня есть пустое поле без ошибки PHP

<nav><ul class="fancynav"></ul></nav>

WTF?

4

Решение

Да, вы можете использовать трюк «encapsed var»:

function hello() {
global $result;
$result = 'hi there!';
return 'result';
}

echo <<<EOF
text ${hello()} text
EOF;

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

5

Другие решения

Поскольку вы не можете напрямую вызвать функцию внутри HEREDOCВы можете поместить имя функции в переменную и использовать эту переменную внутри HEREDOC строка:

    $showcaptcha= 'showcaptcha';
echo
<<<HTML
<br/> dawg {$showcaptcha()} dawg
HTML;

Таким образом, вы можете оставить текущую уже закодированную функцию:

    function showcaptcha()
{
return "Gotta captcha mall";
}

Вы также можете использовать:

    $showcaptcha = function()
{
return "Gotta captcha mall";
}
echo
<<<HTML
<br/> dawg {$showcaptcha()} dawg
HTML;

Если вызываемая функция определена на том же уровне, что и echo (иначе у вас будет глобальная переменная $showcaptcha).

Если у вас есть несколько функций, вы можете сделать цикл перед heredoc:

    function dawg()
{
return "I'm loyal";
}
function cat()
{
return "I'm cute";
}
function fish()
{
return "I'm small";
}
function elephant()
{
return "I'm big";
}

$functionsToCall = array('elephant', 'fish', 'cat', 'dawg');
foreach ($functionsToCall as $functionToCall)
$$functionToCall = $functionToCall;
echo
<<<HTML
<br/> Dawg: {$dawg()}
<br/> Cat: {$cat()}
<br/> Fish: {$fish()}
<br/> Elephant: {$elephant()}
HTML;

Это гораздо менее уродливо, чем использование глобальной переменной.

1

Нет, невозможно использовать функцию внутри строк heredoc.

0
По вопросам рекламы [email protected]