我希望我的脚本声明新变量,同时将它们及其值分配给一个对象。因此,我想编写一个函数来执行此操作,但我无法让该函数在外部作用域中声明新变量。
我尝试了匿名函数和普通函数,并尝试了通过全局关键字和超全局变量设置变量的两种组合。
<?
$output = [];
// anonymous functions approach
$addResult = function (string $key, float $value) use (&$output) {
// 'global' approach
global $$key;
$$key = $value;
// '$GLOBALS' approach
$GLOBALS[$key] = $value;
// rest of the function body (adding KV to obj)
$output[$key] = $value;
};
// normal functions approach
function addResult (string $key, float $value) {
// 'global' approach
global $$key;
$$key = $value;
// '$GLOBALS' approach
$GLOBALS[$key] = $value;
// rest of the function body (adding KV to obj)
global $output;
$output[$key] = $value;
}
// anonymous functions approach
$addResult('var1', 4);
echo $var1; // -> undefined
// normal functions approach
addResult('var1', 4);
echo $var1; // -> undefined
?>
(对于我的测试,我显然总是只对一对安排进行评论)
代码运行时没有 错误,但显示
Warning: Undefined variable $var1 in [path to file]
此外,如果可能的话,我会将函数定义放在文件
A
中,并在包含的文件 addResult
中调用 B
。
我在Win11上的XAMPP上运行php 8.0.25,但代码必须与在debian上的apache2上运行php 8.0的生产服务器兼容。
这里的问题是,您的静态分析器没有“看到”变量的定义,因此将其标记为“不存在”。
您可以将该文件包含在函数中,使所有变量的作用域都在该函数内。
要关闭静态分析器(并保护自己免受上述错误情况的影响),您还需要在函数外部访问 $GLOBALS。
因为在 PHP 中你永远无法完全确定你是否真的在全局命名空间中。