换句话说,fn()
可以知道它被用作$var = fn();
而不是fn();
吗?
用例是echo
后一种情况下的返回值,但前者是return
。
这可以在不将参数传递给函数的情况下完成,以声明它的使用方式吗?
答案 0 :(得分:7)
许多PHP函数通过传递一个名为$ return的布尔值来执行此操作,如果$ return为true则返回该值,或者如果$ return为false则打印该值。有几个例子是print_r()和highlight_file()。
所以你的功能看起来像这样:
function fn($return=false) {
if ($return) {
return 'blah';
} else {
echo 'blah';
}
}
任何其他方式都不是好的编程风格。
答案 1 :(得分:3)
不,它不应该。语言的一个非常基本的前提是函数不知道它们被使用的上下文。这允许您分解您的应用程序,因为每个部分(功能)与其周围环境完全隔离。
那就是说,你可以对这个特定的用例做些什么,就是输出缓冲。默认情况下,echo
会将数据发送到stdout,但您可以设置一个缓冲区,它会将输出捕获到变量中。例如:
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语句。
答案 2 :(得分:2)
请考虑解释器如何执行此语句:
$var = fn();
解释器使用赋值运算符从右到左计算操作数,因此首先它将评估右侧的表达式(在本例中为fn()
),然后将结果赋值给{{1} }。每个表达式都返回一个值,您可以选择如何处理该值。
答案 3 :(得分:0)
不,没有办法找到它。您可以做的独特之处是获取调用堆栈(http://it2.php.net/debug_backtrace)并进行检查。
答案 4 :(得分:0)
不,它不能。
答案 5 :(得分:0)
它不容易做到,但是,如果你只是将一个额外的布尔变量传递给函数呢?这样,函数的结尾看起来像:
if (namespace) {
return $output;
} else {
echo $output;
}
似乎是一个非常简单的解决方法。