在 HEREDOC 字符串中调用 PHP 函数

2022-08-30 07:36:49

在 PHP 中,HEREDOC 字符串声明对于输出 html 块非常有用。你可以让它在变量中解析,只需在变量前面加上$前缀,但对于更复杂的语法(如$var[2][3]),你必须把你的表达式放在{}大括号内。

在 PHP 5 中,实际上可以在 HEREDOC 字符串内的 {} 大括号内进行函数调用,但您必须完成一些工作。函数名称本身必须存储在变量中,并且您必须像动态命名的函数一样调用它。例如:

$fn = 'testfunction';
function testfunction() { return 'ok'; }
$string = <<< heredoc
plain text and now a function: {$fn()}
heredoc;

如您所见,这比仅仅:

$string = <<< heredoc
plain text and now a function: {testfunction()}
heredoc;

除了第一个代码示例之外,还有其他方法,例如中断HEREDOC以调用函数,或者反转问题并执行如下操作:

?>
<!-- directly output html and only breaking into php for the function -->
plain text and now a function: <?PHP print testfunction(); ?>

后者的缺点是输出直接放入输出流中(除非我使用输出缓冲),这可能不是我想要的。

所以,我问题的本质是:有没有一种更优雅的方法来解决这个问题?

根据响应进行编辑:当然,看起来某种模板引擎确实会让我的生活更轻松,但这需要我基本上颠倒我通常的PHP风格。并不是说这是一件坏事,但它解释了我的惰性。不过,我正在努力找出让生活更轻松的方法,所以我现在正在研究模板。


答案 1

如果你真的想这样做,但比使用类简单一点,你可以使用:

function fn($data) {
  return $data;
}
$fn = 'fn';

$my_string = <<<EOT
Number of seconds since the Unix Epoch: {$fn(time())}
EOT;

答案 2

就我个人而言,我根本不会为此使用HEREDOC。它只是不能成为一个好的“模板构建”系统。您的所有HTML都被锁定在一个字符串中,该字符串有几个缺点

  • 所见即所得没有选择
  • 没有来自 IDE 的 HTML 的代码完成
  • 输出 (HTML) 锁定到逻辑文件
  • 你最终不得不使用像你现在试图做的黑客来实现更复杂的模板,比如循环。

获取一个基本的模板引擎,或者只是将PHP与包含一起使用 - 这就是为什么该语言具有和分隔符的原因。<?php?>

template_file.php

<html>
<head>
  <title><?php echo $page_title; ?></title>
</head>
<body>
  <?php echo getPageContent(); ?>
</body>

索引.php

<?php

$page_title = "This is a simple demo";

function getPageContent() {
    return '<p>Hello World!</p>';
}

include('template_file.php');

推荐