全局变量在Laravel中被认为是null,但在正常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 IlluminateSupportFacadesRoute;
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';
});

其次,在routes文件中有一个全局变量,并且可以在任何地方使用,这对我来说都没有任何意义。如果这正是你所要求的,那么有很多更好的方法可以获得全局变量。

更新

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

例如:

创建config/helper.php

<?php
return [
'foo' => 'bar',
];

然后你应该这样做:

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

最新更新