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');
}