global关键字和$GLOBALS数组的使用

<?php

foo();

function foo(): void
{
    // 重要说明:虽然$var变量在自定义函数外部从未声明,但由于使用了global修饰,所以$var在自定义函数外部也能使用了。
    global $var;

    $var = 'PHP是世界上最好の语言';
}

echo $var; // PHP是世界上最好の语言


//========== 总结 ==========//
// 1、上面的代码是不规范的,强烈建议不要这样写,并不是说不能在自定义函数内部使用global关键字引用外部变量,
//    而是使用global修饰的变量应该确保在自定义函数外部就已经初始化好了。



<?php

$name = '张三';

function foo(): void
{
    global $name;
    global $age;

    global $gender;
    $gender = '男';

    if (isset($name)) {
        echo '自定义函数内部:变量$name已声明' . PHP_EOL; // 自定义函数内部:变量$name已声明
    } else {
        echo '自定义函数内部:变量$name未声明' . PHP_EOL;
    }

    if (isset($age)) {
        echo '自定义函数内部:变量$age已声明' . PHP_EOL;
    } else {
        echo '自定义函数内部:变量$age未声明' . PHP_EOL; // 自定义函数内部:变量$age未声明
    }

    if (isset($gender)) {
        echo '自定义函数内部:变量$gender已声明' . PHP_EOL; // 自定义函数内部:变量$gender已声明
    } else {
        echo '自定义函数内部:变量$gender未声明' . PHP_EOL;
    }
}

foo();

if (isset($name)) {
    echo '自定义函数外部:变量$name已声明' . PHP_EOL; // 自定义函数外部:变量$name已声明
} else {
    echo '自定义函数外部:变量$name未声明' . PHP_EOL;
}

if (isset($age)) {
    echo '自定义函数外部:变量$age已声明' . PHP_EOL;
} else {
    echo '自定义函数外部:变量$age未声明' . PHP_EOL; // 自定义函数外部:变量$age未声明
}

if (isset($gender)) {
    echo '自定义函数内部:变量$gender已声明' . PHP_EOL; // 自定义函数内部:变量$gender已声明
} else {
    echo '自定义函数内部:变量$gender未声明' . PHP_EOL;
}


//========== 总结 ==========//
// 1、自定义函数内部使用global修饰的变量也能用isset()对其进行判断,结果和在自定义函数外部是一样的。
// 2、使用global修饰一个函数内外都没声明过的变量,如果不赋值,那么它的值默认为null,所以isset()结果为false。



<?php
$name = '张三';
$gender = '男';
$age = 18;

function foo(): void
{
    global $age;

    echo "(1) 俺叫{$GLOBALS['name']}{$GLOBALS['gender']}),今年{$age}岁。" . PHP_EOL; // (1) 俺叫张三(男),今年18岁。


    $GLOBALS['name'] = '李四';
    $GLOBALS['gender'] = '女';
    $age = 17;
}

foo();

echo "(2) 俺叫{$name}{$gender}),今年{$age}岁。" . PHP_EOL; // (2) 俺叫李四(女),今年17岁。


//========== 总结 ==========//
// 1、无论是global关键字还是$GLOBALS数组,它们的效果是完全一样的,都能在自定义函数内部引用外部变量,
//    并且在函数内部修改这些变量会影响外部的值。

Copyright © 2024 码农人生. All Rights Reserved