为了账号安全,请及时绑定邮箱和手机立即绑定

在HEREDOC字符串中调用PHP函数

在HEREDOC字符串中调用PHP函数

PHP
慕后森 2019-10-17 13:13:49
在PHP中,HEREDOC字符串声明对于输出html块确实非常有用。您可以通过在变量前面加上$来解析变量,但是对于更复杂的语法(例如$ var [2] [3]),则必须将表达式放在{}中。在PHP 5中,这是可能实际上使函数调用中的{}一HEREDOC字符串中括号,但你必须要经过一些工作。函数名称本身必须存储在变量中,并且必须像动态命名函数一样调用它。例如:$fn = 'testfunction';function testfunction() { return 'ok'; }$string = <<< heredocplain text and now a function: {$fn()}heredoc;如您所见,这不仅比以下情况更混乱:$string = <<< heredocplain 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样式。并不是说那是一件坏事,但这可以解释我的惯性。尽管我想尽办法使生活变得更轻松,所以我现在正在研究模板。
查看完整描述

3 回答

?
狐的传说

TA贡献1804条经验 获得超3个赞

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


所见即所得没有选择

IDE中的HTML没有代码完成

输出(HTML)锁定到逻辑文件

您最终不得不像现在尝试那样使用hack来实现更复杂的模板,例如循环

获得基本的模板引擎,或仅将PHP与include一起使用-这就是该语言具有<?php和?>分隔符的原因。


template_file.php


<html>

<head>

  <title><?php echo $page_title; ?></title>

</head>

<body>

  <?php echo getPageContent(); ?>

</body>

index.php


<?php


$page_title = "This is a simple demo";


function getPageContent() {

    return '<p>Hello World!</p>';

}


include('template_file.php');


查看完整回答
反对 回复 2019-10-17
?
弑天下

TA贡献1818条经验 获得超7个赞

如果您确实想这样做,但是比使用类简单一些,则可以使用:


function fn($data) {

  return $data;

}

$fn = 'fn';


$my_string = <<<EOT

Number of seconds since the Unix Epoch: {$fn(time())}

EOT;


查看完整回答
反对 回复 2019-10-17
?
白衣染霜花

TA贡献1796条经验 获得超10个赞

尝试以下操作(作为全局变量,或在需要时实例化):


<?php

  class Fn {

    public function __call($name, $args) {

      if (function_exists($name)) {

        return call_user_func_array($name, $args);

      }

    }

  }


  $fn = new Fn();

?>

现在,任何函数调用都将通过$fn实例。因此,现有功能testfunction()可以在Heredoc中使用{$fn->testfunction()}


基本上,我们将所有函数包装到一个类实例中,并使用PHP的__call magic方法将类方法映射到需要调用的实际函数。


查看完整回答
反对 回复 2019-10-17
  • 3 回答
  • 0 关注
  • 469 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信