Можно ли использовать функции в шаблоне 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?
Да, вы можете использовать трюк «encapsed var»:
function hello() {
global $result;
$result = 'hi there!';
return 'result';
}
echo <<<EOF
text ${hello()} text
EOF;
Технически это работает, но лучше избегать подобных взломов на производстве. Временная переменная будет намного чище.
Поскольку вы не можете напрямую вызвать функцию внутри 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;
Это гораздо менее уродливо, чем использование глобальной переменной.
Нет, невозможно использовать функцию внутри строк heredoc.