换句话说,可以fn()
知道它被用作$var = fn();
而不是用作fn();
吗?
在后一种情况下,一个用例是echo
返回值,但return
在前一种情况下是返回值。
这可以在不向函数传递参数来声明它的使用方式的情况下完成吗?
许多 PHP 函数通过传递一个名为 $return 的布尔值来执行此操作,如果 $return 为 true,则返回该值,如果 $return 为 false,则打印该值。几个例子是print_r()和highlight_file()。
所以你的函数看起来像这样:
function fn($return=false) {
if ($return) {
return 'blah';
} else {
echo 'blah';
}
}
任何其他方式都不是好的编程风格。
不,也不应该。函数不知道使用它们的上下文是语言的一个非常基本的前提。这允许您分解您的应用程序,因为每个部分(功能)都与周围环境完全隔离。
也就是说,您可以对这个特定用例做些什么,就是打开输出缓冲。默认情况下echo
会将数据发送到标准输出,但您可以设置一个缓冲区,它将输出捕获到一个变量中。例如:
function foo() {
echo "Hello World";
}
foo(); // will output "Hello World"
ob_start();
foo();
$foo = ob_get_clean(); // will assign the string "Hello World" into the variable $foo
除此之外,直接输出函数通常被认为是不好的风格。您通常应该返回一个字符串并将其留给脚本的顶层输出。理想情况下,整个应用程序中应该只有一个 echo 语句。
想想解释器是如何执行这个语句的:
$var = fn();
解释器使用赋值运算符从右到左计算操作数,因此首先它将计算右侧的表达式(fn()
在这种情况下),然后将结果分配给$var
. 每个表达式都返回一个值,您可以选择如何处理该值。
不,没有办法找出来。您可以做的唯一事情是获取调用堆栈 ( http://it2.php.net/debug_backtrace ) 并检查它。
不,它不能。
它不容易做到,但是,如果你只是将一个额外的布尔变量传递给函数呢?这样,函数的结尾将如下所示:
if (namespace) {
return $output;
} else {
echo $output;
}
似乎是一个非常简单的解决方法。