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
驻留在全局变量范围内。感谢您的解释。现在我有事情要处理。谢谢你的解释。现在我有事情要处理。