Использование приведенного ниже глупого подхода должно дать вам то, что вы хотите. Эй ... было весело писать :)
<?php
/**
* The function which output you want to test.
*
* @param string $arg1
* @param string $arg2
*/
function function_with_echo($arg1, $arg2) {
$c = array();
echo "X";
foreach (range(0,2) as $i) {
print $i * 2 . $arg2;
}
echo "Yir $arg1";
}
/**
* Stupid, too big, ugly function that takes a function and creates a new
* function with two underscores prefixed (__) where all echo and print
* statements instead are collected into a temporary variable and returned.
* Does not work for functions that already returns something, although
* that could be fixed too!
*
* @param string $function_name
*/
function change_output_to_return($function_name) {
$r = new ReflectionFunction($function_name);
$lines = array_slice(
file($r->getFileName()),
$r->getStartLine() - 1,
$r->getEndLine() - $r->getStartLine() + 1
);
$first = array_shift($lines);
array_unshift($lines, $first, '$__temp = "";' . "\n");
$last = array_pop($lines);
array_push($lines, 'return $__temp;' . "\n", $last);
$code = "<?php " . implode("", $lines);
$echo_free_code = '';
foreach(token_get_all($code) as $token) {
if(is_array($token)) {
if (in_array(token_name($token[0]), array('T_ECHO', 'T_PRINT'))) {
$echo_free_code .= '$__temp .= ';
} else {
$echo_free_code .= $token[1];
}
} else {
$echo_free_code .= $token;
}
}
$echo_free_code = str_replace($function_name, "__$function_name", $echo_free_code);
eval("?>$echo_free_code");
}
// Creates a function called "__function_with_echo" that returns a string
// instead of outputting it using "print" and "echo".
change_output_to_return('function_with_echo');
// Stuff contains the outputted data from "function_with_echo".
$stuff = __function_with_echo('fun', 'stuff');
var_dump($stuff);
Php echo "Hello World"; ?> :-) зачем использовать функции для эха? – zod
@zod, если это было так просто, то почему бы просто не сделать??> Hello World Php' и вообще не использовать 'echo'. Я бы предположил, что OP необходимо собрать строки из разных источников или условно, и вы не захотите засорять этот код внутри своих шаблонов. Вопрос скорее должен быть, почему OP не возвращает строки и «эхо» их там, где это необходимо. Это облегчит тестирование функций (и решает проблемы). – Gordon
Ни одна из основанных на JUnit API фреймворков (PHPUnit, SimpleTest, SnapTest) не может сделать это (без обходных решений). Для необработанного тестирования функциональности PHP попробуйте скрипты '.phpt'. – mario