PHP:函数可以知道它是否被赋值为值?

时间:2008-11-02 17:43:55

标签: php function

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

用例是echo后一种情况下的返回值,但前者是return

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

6 个答案:

答案 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;
}

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