Php 从闭包中的全局范围访问变量

Php 从闭包中的全局范围访问变量,php,scope,closures,Php,Scope,Closures,我清楚地意识到,全球化是邪恶的,这是一个我将在稍后处理的问题。这不是我的代码库,但我被分配了一些清理任务 为了优化代码库,我决定使用一个名为-的包来实现简单的路由,我以前使用过它,它对我的目的来说运行良好 现在,代码库正在使用大量在全局范围内声明的变量。通常,然后使用global关键字获取这些变量。但出于某种原因,当我在闭包内工作时,这不起作用 考虑这个简单的路由示例: <?php require 'vendor/autoload.php'; $router = new AltoRoute

我清楚地意识到,全球化是邪恶的,这是一个我将在稍后处理的问题。这不是我的代码库,但我被分配了一些清理任务

为了优化代码库,我决定使用一个名为-的包来实现简单的路由,我以前使用过它,它对我的目的来说运行良好

现在,代码库正在使用大量在全局范围内声明的变量。通常,然后使用
global
关键字获取这些变量。但出于某种原因,当我在闭包内工作时,这不起作用

考虑这个简单的路由示例:

<?php
require 'vendor/autoload.php';
$router = new AltoRouter();

$router->map('GET', '/shops/[i:id]', function($id) {

    $_GET['shop_id'] = $id;
    require 'go_to_shop.php';
});

$match = $router->match();

if( $match && is_callable( $match['target'] ) ) {
    call_user_func_array( $match['target'], $match['params'] );
}
$serviceContainer
是通过在早期包含一个文件来声明的:

$serviceContainer = new ServiceContainer();
$serviceContainer->set("dispatcher", new EventDispatcher());
基本上,如果我将闭包的内容移到闭包之外,一切都会很好地工作——但是一旦我从闭包内部进行操作,通过全局作用域访问的所有变量都是空的——我不知道为什么

我试过在闭包上使用
use
,这也不起作用


我主要是在寻找解释,而不是解决办法

地球人是邪恶的,这是有原因的。由于在调用函数时未初始化全局函数,因此会出现错误。
global
s和
require
s的混乱正是问题所在,您已经在尝试解决它了

在闭包中使用globals本身没有问题。这个例子非常好:

global.php:

<?php
class Foo {
    public function bar() { return 'bar';}
}

$foo = new Foo;

全球人之所以邪恶是有原因的。由于在调用函数时未初始化全局函数,因此会出现错误。
global
s和
require
s的混乱正是问题所在,您已经在尝试解决它了

在闭包中使用globals本身没有问题。这个例子非常好:

global.php:

<?php
class Foo {
    public function bar() { return 'bar';}
}

$foo = new Foo;

我非常确定,
$serviceContainer
变量不存在于全局范围中,但问题将该部分排除在外

您不能使用
use($serviceContainer)
语句将容器传递给匿名函数吗?这将是一个更干净的解决方案,然后必须依赖于全球

function($id) use( $serviceContainer ) {

   $_GET['shop_id'] = $id;
   require 'go_to_shop.php';
}

离题:不确定稍后您将如何处理该id变量,以及为什么要将其像那样放回$\u GET变量,但请小心

我很确定,
$serviceContainer
变量在全局范围内不存在,但问题是该部分被忽略了

您不能使用
use($serviceContainer)
语句将容器传递给匿名函数吗?这将是一个更干净的解决方案,然后必须依赖于全球

function($id) use( $serviceContainer ) {

   $_GET['shop_id'] = $id;
   require 'go_to_shop.php';
}

离题:不确定稍后您将如何处理该id变量,以及为什么要将其像那样放回$\u GET变量,但请小心

请查看手册中的匿名函数–也称为闭包,实际上是对象

这些可调用函数具有扩展其作用域的特定函数

请参阅:示例#3从父范围继承变量

$message = 'hello';

// No "use"
$example = function () {
  var_dump($message);
};
$example();

// Inherit $message
$example = function () use ($message) {
  var_dump($message);
};
$example();
确实要为$\u GET全局变量赋值吗

$_GET['shop_id'] = $id;
您可以从altorouter参数提取的路线中的店铺ID。(请参阅文档。)


或者,如果您想为会话存储ID,请使用$\u COOKIES或$\u会话全局变量。

请查看手册中的匿名函数–也称为闭包,它们实际上是对象

这些可调用函数具有扩展其作用域的特定函数

请参阅:示例#3从父范围继承变量

$message = 'hello';

// No "use"
$example = function () {
  var_dump($message);
};
$example();

// Inherit $message
$example = function () use ($message) {
  var_dump($message);
};
$example();
确实要为$\u GET全局变量赋值吗

$_GET['shop_id'] = $id;
您可以从altorouter参数提取的路线中的店铺ID。(请参阅文档。)


或者,如果要存储会话ID,请使用$\u COOKIES或$\u会话全局变量。

是函数中声明包含
$serviceContainer
的文件…?@deceze,否,它只是一个包含在全局变量作用域中的文件,
$serviceContainer
驻留在全局变量作用域中。是否在函数中声明包含
$serviceContainer
的文件…?@deceze,否,它只是一个包含的文件,
$serviceContainer
驻留在全局变量范围内。感谢您的解释。现在我有事情要处理。谢谢你的解释。现在我有事情要处理。