无法在函数内注册新的全局变量

问题描述 投票:0回答:1

我希望我的脚本声明新变量,同时将它们及其值分配给一个对象。因此,我想编写一个函数来执行此操作,但我无法让该函数在外部作用域中声明新变量。

我尝试了匿名函数和普通函数,并尝试了通过全局关键字和超全局变量设置变量的两种组合。

<?
    $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的生产服务器兼容。

php scope php-8
1个回答
0
投票

这里的问题是,您的静态分析器没有“看到”变量的定义,因此将其标记为“不存在”。

您可以将该文件包含在函数中,使所有变量的作用域都在该函数内。

要关闭静态分析器(并保护自己免受上述错误情况的影响),您还需要在函数外部访问 $GLOBALS。

因为在 PHP 中你永远无法完全确定你是否真的在全局命名空间中。

© www.soinside.com 2019 - 2024. All rights reserved.