【发布时间】:2016-05-27 08:58:34
【问题描述】:
我很清楚全局变量是邪恶的,这是我稍后会处理的问题。这不是我的代码库,但我被分配了一些清理任务。
为了使代码库更智能,我决定使用一个名为 AltoRouter 的包来实现简单的路由 - 我以前使用过它,它对我的目的来说效果很好。
现在,代码库正在使用在全局范围内声明的大量变量。通常,这些变量然后使用globalkeyword 获取。但由于某种原因,当我在闭包内工作时,这不起作用。
考虑这个简单的路由示例:
<?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'] );
}
这调用了我的闭包,它设置了一个变量并需要一个文件。
这会产生错误:
致命错误:调用成员函数 get() on null in /vagrant/Core/CampaignHandler.php 第 71 行
现在,执行此操作的代码如下(第 70-71 行):
// Inside a method
global $serviceContainer;
$dispatcher = $serviceContainer->get("dispatcher");
$serviceContainer 是通过在早期包含一个文件来声明的:
$serviceContainer = new ServiceContainer();
$serviceContainer->set("dispatcher", new EventDispatcher());
基本上,如果我将闭包的内容移到闭包之外,一切都会完美运行 - 但是一旦我从闭包内部执行此操作,通过全局范围访问的所有变量都是空的 - 我没有想知道为什么。
我试过在闭包上使用use,这也不起作用。
我主要是在寻找解释而不是解决方案。
【问题讨论】:
-
声明
$serviceContainer的文件是否包含在函数中...? -
@deceze,不,它只是一个包含的文件,
$serviceContainer驻留在全局变量范围内。