全局变量在 Laravel 中被视为 null,但在正常 PHP 中正确显示

Global variable in considered as null in Laravel, but correctly seen in normal PHP

pure-php.php

<?php
`
$var = 'OK!';

function my_function()
{
    global $var;
    echo !is_null($var) ? $var : '$var is null';
}

my_function();

结果:

OK!

现在看看这个:

app/Helpers/global.php


$var = 'OK!';

function myfunction() {
    global $var;

    echo !is_null($var) ? $var : '$var is null';
}

composer.json

...
"autoload": {
    "psr-4": {
        "App\": "app/"
    },
    "files": [
        "app/Helpers/global.php"
    ],
...

然后我做了composer dump-autoload

app/routes/web.php

<?php

use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    dump('before');

    myfunction();

    dump('after');
});

结果在 http://127.0.0.1:8000/

before
$var is null
after

:-/

我想知道为什么我们无法获取变量的值?

首先,在您的 laravel 代码中,它位于 PHP 闭包或匿名函数中,但在您的 pure-php.php 中,它只是一个普通的 PHP 函数。所以为了使用 $var 你需要这样做:

$var = 'OK!';

Route::get('/', function () use ($var) {
    echo !is_null($var) ? $var : '$var is null';
});

其次,在路由文件中有一个全局变量并且可以在任何地方使用对我来说没有任何意义。如果您需要的话,有很多更好的方法来获取全局变量。

更新

这是 Composer 自动加载的默认行为,而不是 Laravel。与Laravel无关。 Composer 尽一切努力在自动加载期间不污染全局范围。如果你想强制使用全局变量,那么你应该在你的配置文件中将它们声明为全局变量。

例如:

创建config/helper.php

<?php

return [
    'foo' => 'bar',
];

然后你应该这样做:

function myfunction()
{
    return config('helper.foo');
}