【问题标题】:Variable assignment in function call函数调用中的变量赋值
【发布时间】:2013-11-27 05:40:54
【问题描述】:

我继承了一个 php 代码库,其中包含函数调用中的一些变量赋值:

<?php
function some_func($foo, $state) {
  ....
}

some_func("random stuff", $state = true);
...
some_func("other stuff", $state = false);
...
?>

我进行了一些研究和一些测试,但我无法找出此代码在 PHP 中定义的行为。

some_func() 的第二个参数的值是如何计算的? 4state 变量的内容(第一次调用为真,第二次为假)?还是赋值的结果(即将true/false赋值给变量$state是成功的,所以some_func收到了true

$state 变量在全局范围内的值是多少?赋值的结果,即第一次调用为真,第二次为假?

【问题讨论】:

  • 这看起来不对。

标签: php variable-assignment


【解决方案1】:

我也必须使用具有与此类似的函数调用的代码库。幸运的是,我可以接触到编写代码的开发人员。这是我学到的。

场景 1:

只是一种记录代码的方法。您知道要传递给函数的变量名称。

场景 2:

这是一个链接:http://www.php.net/manual/en/language.references.pass.php 如果你看到了,他们确实特别指出了你的情况:

foo($a = 5); // Expression, not variable

一个“虚拟”传递引用。根据您的 PHP 版本,它可能会引发警告。我得到了这个:Strict Standards: Only variables should be passed by reference in ...

现在让我详细介绍一下在这种情况下发生了什么。

危险的是,您提供的示例不会显示“陷阱!”行为。在这种情况下,您在函数外部回显的$arg2 将始终是函数调用中的表达式设置的内容。此外,被调用的函数也将被发送该值的“副本”,并使用它。我说“复制”是因为即使函数需要传递引用,它实际上也得到了一个副本,类似于普通函数参数会得到的。

如果您修改函数内部的$arg2,它不会修改函数外部的$arg2,正如您对传递函数所期望的那样-参考。

【讨论】:

  • 参考页面甚至对具体示例进行了说明:不应通过引用传递其他表达式,因为结果未定义。例如,以下引用传递的例子是无效的。所以这实际上是未定义的行为。由于该值未在函数外部使用,因此我将其替换为some_func("random stuff", true);。谢谢:)
  • 你是对的,它不在函数之外,因此按原样设置是安全的。祝你好运!
【解决方案2】:

要在函数调用时分配变量,您必须pass it as a reference (&amp;$var):

function my_function($arg1, &$arg2) {
  if ($arg1 == true) {
    $arg2 = true;
  }
}
my_function(true, $arg2 = false);
echo $arg2;

输出 1(真)

my_function(false, $arg2 = false);
echo $arg2;

输出 0(假)

some_func() 的第二个参数的值是如何计算的?

它不是“计算的”,而是显式设置:$state = true / false,然后作为参数传递给some_func()

$state 变量在全局范围内的值是多少?

$state 不存在于全局范围内。

【讨论】:

  • 我知道如何通过引用传递东西,但这并不能解释发布的代码是如何工作的。我想用完全相同的东西替换它,但更容易理解,但要做到这一点,我需要找出它的实际作用。
猜你喜欢
  • 1970-01-01
  • 2020-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
  • 2018-07-08
  • 1970-01-01
  • 2016-09-15
相关资源
最近更新 更多