gpt4 book ai didi

php - 函数分配一个不为空的参数

转载 作者:可可西里 更新时间:2023-11-01 13:36:59 24 4
gpt4 key购买 nike

这是我上一个问题的后续问题。

Run a function without a parameter but needed a variable outside of the function - PHP

我收到了这个回复

function foo($arg1 = null, $arg2 = null) {
// if they are not set retrieve from a session
$arg1 = ($arg1 !== null) ? $arg1 : $_SESSION['arg1'];
// rinse repeat.
}

所以我想,也许我可以通过防止在每个函数上调用相同的变量来减少代码行。

我想到了这个。

function foo($arg1 = $_SESSION['user_id'], $arg2 = $_SESSION['campaign_id']) {
//do something
}

不幸的是,我收到了这个错误。

Parse error: syntax error, unexpected T_VARIABLE

是否有导致此结果的原因?我只是将 null 替换为一个包含值的变量。

有没有什么方法可以给一个参数已经有值的函数赋值,而不是赋一个空值?

附言

我正在尝试使用 echo $campaign->getName() 输出数据,因此在调用函数时没有提供任何参数。

所以我正在尝试调用这样的函数

function foo($arg1 = $_SESSION['user_id'], $arg2 = $_SESSION['campaign_id']) {
//do something
}

如果有什么办法可以不用一遍又一遍地调用同一个变量。

如有任何帮助,我们将不胜感激。 :)

最佳答案

tl;dr

不要尝试(它甚至不像你看到的那样工作),使用适当的 DI(依赖注入(inject))并将你的外部(全局)变量作为参数传递:

// functions should be deterministic — require the arguments in favour of using dynamic defaults
function foo($arg1 /* require it */, $arg2 = 1 /* static scalars as default is no problem */) {
// your code
}
foo($_SESSION["user_id"]); // always pass dynamic arguments, don't fetch them in the function

简介

不能像所谓的静态标量那样默认使用任何其他东西。这些是文字(字符串、整数等)、常量和(自 PHP 5.6 起)对这些文字/常量的操作。

所以...

我两年多前就有了同样的好主意并提交了错误报告... https://bugs.php.net/bug.php?id=60544

今天我认为这不是一个好主意。语言的默认值应该是静态的。我怀疑那些设计 PHP 的人没有他们的理由。

但还是有办法...

可以怎么做(不推荐)

此处唯一的解决方法是使用常量。

function foo($arg = ARG) {
var_dump($arg);
}

在您确定该值不会再改变的那一刻,在第一次调用函数之前定义常量:

define("ARG", $_SESSION["user_id"]);

然后您可以稍后通过 foo(); 调用它。

这是可能的,因为这里对常量进行了惰性求值。

此方法的缺点是您必须定义一次常量,然后它将在脚本运行时的其余部分保持不可变。

但我还是强烈不推荐。它很老套并且有很大的缺点。

如何做得更好

您向我们展示了如何做到这一点:

$arg1 = ($arg1 !== null) ? $arg1 : $_SESSION['arg1'];

这绝对是正确的方法。如果你真的想做的话。

但您仍然不应该那样做。您正在从函数访问全局范围(超全局)。

应该怎么做

语言设计者没有实现这种可能性是有原因的,这也是为什么我们不应该通过函数中的常量或全局范围访问来尝试以任何方式规避这种可能性的原因。

你真的应该正确地使用依赖注入(inject)并通过参数将外部(全局)值传递给函数。 (请参阅 tl;dr 部分中的示例)

您提议的这种代码很容易导致难以调试的代码,因为人们可能不希望真正的函数访问全局状态。

这就是为什么函数对于给定的输入应该具有确定性输出(除非它们被明确认为是非确定性的,例如读取文件的函数),这会显着提高可测试性和可移植性。

关于php - 函数分配一个不为空的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23004706/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com