2012-01-04 49 views
1

我有一个简单的PHP函数输出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; 
} 
?> 
+2

第二个代码块有什么问题?(除了EOD之外;不应该在任何空格之前加上 – 2012-01-04 17:08:18

+0

)为什么你不能修改现有的函数? – 2012-01-04 17:08:48

+0

@Truth:第二块代码可以正常工作,但是我正在寻找一个解决方案,我不需要将这段HTML代码复制到另一个函数中。对不起,我不清楚我没有权限直接修改'get_header()'。谢谢。 – moey 2012-01-04 17:15:47

回答

8

您可以使用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

+1为一个干净的输出缓冲解决方案。 – 2012-01-04 17:09:50

+0

另外+1的非常详细的帮助。谢谢! – moey 2012-01-04 17:24:23

1

使用输出缓冲:

<?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岩石!

+0

使用输出以这种方式缓冲是完全矫枉过正的,而且你正在修改原始功能。 – 2012-01-04 17:10:17

0

得到一个HTML内容功能的内容的最佳动作以下,然后它应该是你的手:

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

在这种方法中,你可以轻松地复制粘贴所需的HTML标签和内容到您的代码并轻松使用它们。

我用过ob_start();在html标签开始之前,并在结束我用返回ob_get_clean();