【问题标题】:PHP: Can a function know if it's being assigned as a value?PHP:一个函数能知道它是否被赋值为一个值吗?
【发布时间】:2010-09-20 09:40:28
【问题描述】:

换句话说,fn() 能否知道它被用作$var = fn(); 而不是fn();

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

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

【问题讨论】:

  • 你知道你是否在矩阵中吗?

标签: php function


【解决方案1】:

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

所以你的函数应该是这样的:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      $var = fn();
      

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 这是一件很糟糕的事情,除非是为了调试。
        • 因为它是一种非常神奇且非标准的改变函数行为的方法。此外,在生产代码中使用堆栈跟踪进行模拟是自找麻烦。在我看来,错误处理程序可以称为“用于调试”。
        【解决方案5】:

        不,它不能。

        【讨论】:

          【解决方案6】:

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

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

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

          【讨论】:

          • 我在问题中指定:“可以在不向函数传递参数以声明其使用方式的情况下完成此操作吗?”
          • 快速扫描问题并没有看到。编辑反映。
          • 传递参数的缺点是它更多的代码,为了改变参数的长度或顺序,它必须在任何地方改变它的代码。不仅如此,我问这个问题是因为我真的想了解更多关于 PHP 语言/语法特性的信息。
          • 当你这样说的时候,我也想回答这个问题。我一直将该解决方案视为节省时间的解决方案,您说得对,过了一段时间,它开始看起来像透明胶带解决方案。如果有更好的方法,我很想听听。
          猜你喜欢
          • 2021-08-25
          • 2020-06-18
          • 1970-01-01
          • 2014-08-09
          • 1970-01-01
          • 2012-04-08
          • 2021-10-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多