【问题标题】:Modify an Existing PHP Function to Return a String修改现有 PHP 函数以返回字符串
【发布时间】:2026-01-28 11:30:01
【问题描述】:

我有一个输出 HTML 的简单 PHP 函数。

<?php
function get_header() {
?>
<div id="header">
  <div class="page-width">
  <!-- And a lot more HTML after this line. -->
<?php
}
?>

所以,当我调用get_header() 时,函数会输出 HTML。

调整此函数以将 HTML 作为字符串返回的最简单选项是什么?我需要围绕这个函数创建一个包装器吗?换句话说,我希望能够做例如var html_string = get_header_wrapper(),其中html_string 包含上述所有 HTML。

我能想到的一件事是复制该函数并使其返回一个字符串。但是,这样会非常低效,因为它会引入大量重复代码。

<?php
function get_header_wrapper() {
  var ret = <<<EOD
  <div id="header">
    <div class="page-width">
    <!-- And a lot more HTML after this line. -->
  ...
  EOD;

  return ret;
}
?>

【问题讨论】:

  • 第二个代码块有什么问题? (除了 EOD 之外,不应在前面添加任何空格。
  • 为什么不能修改已有的功能?
  • @Truth:第二个代码块可以正常工作。但是,我一直在寻找一种解决方案,我不必将那段 HTML 代码复制到不同的函数中。抱歉,我不清楚我没有权限直接修改get_header()。谢谢。
  • 可能有用:what is output buffering?

标签: php function


【解决方案1】:

您可以使用output bufferingDocs 来获取该函数的输出:

ob_start();
get_header();
$html = ob_get_clean();

如果你不止一次需要它,你可以把它包装成它自己的函数:

/**
 * call a function and return it's output as string.
 * 
 * @param callback $function
 * @param array $arguments (optional)
 * @param var $return (optional) the return value of the callback
 * @return string function output
 */
function ob_get_call($function, array $arguments = array(), &$return = NULL)
{
    ob_start();
    $return = call_user_func_array($function, $arguments);
    $buffer = ob_get_clean();
    return $buffer;
}

用法:

$html = ob_get_call('get_header');

由于答案在今天很流行,这里有另一个函数来获取包含的输出:

/**
 * include a file and return it's output as string.
 * 
 * @param string $file
 * @param array $variables (optional) keys as variable names and values as variable values
 * @param var $includeReturn (optional) the return value of the include
 * @return string function output
 */
function ob_get_include($file, array $variables = array(), &$includeReturn = NULL)
{
    $includeFilename = $file;
    unset($file);
    extract($variables);
    unset($variables);
    ob_start();
    $includeReturn = include($includeFilename);
    return ob_get_clean();
}

用法:

include.php:

<div class="greeting">
    Hello <em><?php echo htmlspecialchars($name); ?></em>!
</div>

使用:

$variables = array(
    'name' => 'Marianne',
);
$html = ob_get_include('include.php', $vars);

相关:

【讨论】:

  • 另外 +1 以获得非常详细的帮助。谢谢!
【解决方案2】:

使用输出缓冲:

<?php
function get_header() {
  ob_start();
  <div id="header">
    <div class="page-width">
    <!-- And a lot more HTML after this line. -->
  ...
  $content = ob_get_contents();
  ob_end_clean();
  return $content;
}
?>

您甚至可以在返回字符串之前对其进行一些处理。 OB 摇滚!

【讨论】:

  • 以这种方式使用输出缓冲完全是矫枉过正。另外,您正在修改原始功能。
【解决方案3】:

获取 html-content 函数内容的最佳操作如下,然后它应该就在你手边:

function html_content(){
ob_start();?>
    <div class="some-div" id='the_id'>html text goes here
    </div>
<?php 
return ob_get_clean();
}

通过此方法,您可以轻松地将所需的html标签和内容复制粘贴到您的代码中并轻松使用。

我在html标签开始之前使用了ob_start();,最后我使用了return ob_get_clean();

【讨论】: