PHP:一个函数能知道它是不是被赋值为一个值吗?

Posted

技术标签:

【中文标题】PHP:一个函数能知道它是不是被赋值为一个值吗?【英文标题】: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它。

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

【问题讨论】:

你知道你是否在矩阵中吗? 【参考方案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 语言/语法特性的信息。 当你这样说的时候,我也想回答这个问题。我一直将该解决方案视为节省时间的解决方案,您说得对,过了一段时间,它开始看起来像透明胶带解决方案。如果有更好的方法,我很想听听。

以上是关于PHP:一个函数能知道它是不是被赋值为一个值吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何修改全局变量的值

我可以从 glmmTMB 的 emmeans 中获取 p 值吗?

设计一个函数,它接受不定数量的参数,这是参数都是函数。这些函数都接受一个回调函数作为参数,按照回调函数被调用的顺序返回函数名

迭代器在添加到添加到列表向量的结构中时会停止指向某个值吗?

php函数中,多个参数的情况下怎么使其中一个参数为默认值而其他的使用指定值

我们能知道哪个块/线程找到设备内存的最小值吗?