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 值吗?
设计一个函数,它接受不定数量的参数,这是参数都是函数。这些函数都接受一个回调函数作为参数,按照回调函数被调用的顺序返回函数名