1

很多时候,当我有一个小的配置文件(例如 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 中,即使确实存在匿名函数,上面的构造也不起作用:

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

所以我能看到保护我的临时变量不受全局影响的唯一方法是将代码包装在一个命名函数中:

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

return create_my_config();

但这现在泄露了一个全局函数名。当然,我可以命名它,但我不确定这会更好。

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

4

1 回答 1

1

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

索引.php:

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

配置.php:

<?php
return call_user_func(function(){
    return ["host" => "localhost", "user" => "root", "password" => ""];
});
于 2013-09-21T18:54:21.530 回答