4

换句话说,可以fn()知道它被用作$var = fn();而不是用作fn();吗?

在后一种情况下,一个用例是echo返回值,但return在前一种情况下是返回值。

这可以在不向函数传递参数来声明它的使用方式的情况下完成吗?

4

6 回答 6

7

许多 PHP 函数通过传递一个名为 $return 的布尔值来执行此操作,如果 $return 为 true,则返回该值,如果 $return 为 false,则打印该值。几个例子是print_r()highlight_file()

所以你的函数看起来像这样:

function fn($return=false) {
    if ($return) {
        return 'blah';
    } else {
        echo 'blah';
    }
}

任何其他方式都不是好的编程风格。

于 2008-11-02T18:46:13.697 回答
3

不,也不应该。函数不知道使用它们的上下文是语言的一个非常基本的前提。这允许您分解您的应用程序,因为每个部分(功能)都与周围环境完全隔离。

也就是说,您可以对这个特定用例做些什么,就是打开输出缓冲。默认情况下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 语句。

于 2008-11-02T18:35:35.760 回答
2

想想解释器是如何执行这个语句的:

$var = fn();

解释器使用赋值运算符从右到左计算操作数,因此首先它将计算右侧的表达式(fn()在这种情况下),然后将结果分配给$var. 每个表达式都返回一个值,您可以选择如何处理该值。

于 2008-11-02T19:19:18.777 回答
0

不,没有办法找出来。您可以做的唯一事情是获取调用堆栈 ( http://it2.php.net/debug_backtrace ) 并检查它。

于 2008-11-02T17:49:48.363 回答
0

不,它不能。

于 2008-11-02T17:49:59.223 回答
0

它不容易做到,但是,如果你只是将一个额外的布尔变量传递给函数呢?这样,函数的结尾将如下所示:

if (namespace) {
    return $output;
} else {
    echo $output;
}

似乎是一个非常简单的解决方法。

于 2008-11-02T17:54:30.023 回答