如何保护PHP中的全局变量泄漏代码块?

时间:2013-09-21 13:49:05

标签: php

很多时候,当我有一个小的配置文件,例如Doctrine cli-config.php文件时,我需要使用一些临时变量,当这个文件被包含在其他地方时我不想泄漏为全局变量

例如,在以下配置文件中,$container$em在包含它的代码的上下文中泄漏:

$container = Bootstrap::createDependencyInjectionContainer();
$em = $container->get('Doctrine\ORM\EntityManager');

return new \Symfony\Component\Console\Helper\HelperSet(array(
    'db' => new Helper\ConnectionHelper($em->getConnection()),
    'em' => new Helper\EntityManagerHelper($em)
));

在Javascript中,我可以使用以下构造来隔离代码块:

(function() {

})();

但是在PHP中,即使anonymous functions确实存在,上面的构造也不起作用:

  

解析错误:语法错误,意外'('in ...

因此,我可以看到保护我的临时变量不是全局的唯一方法是将代码包装在命名函数中:

function create_my_config() {
    // wrap the cli-config.php code above
}

return create_my_config();

但是现在泄漏了一个全局函数名称。当然,我可以命名它,但我不确定这会好得多。

有没有办法在不创建命名函数的情况下隔离代码块及其所有变量?

1 个答案:

答案 0 :(得分:1)

PHP不支持自调用匿名函数,但您仍然可以使用call_user_func

调用它

的index.php:

<?php
$config = require 'config.php';

的config.php:

<?php
return call_user_func(function(){
    return ["host" => "localhost", "user" => "root", "password" => ""];
});