2013-09-21 66 views
1

很多時候,當我有一個小配置文件(如Doctrine cli-config.php文件)時,我需要使用一些臨時變量,我不想將這個文件作爲全局變量泄漏到其他位置。如何保護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確實存在,上面的結構不起作用:

解析錯誤:語法錯誤,意外「(」在...

所以我可以看到保護我的臨時變量被全球唯一的辦法是包裝中的代碼命名函數:

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

return create_my_config(); 

但是這現在泄漏了一個全局函數名。當然,我可以命名它,但我不確定這會好多少。

有沒有辦法隔離代碼塊及其所有變量而不創建命名函數?

+0

如果我數組的括號假設在getConnection()「)關閉時沒有錯。因爲我可以在代碼 – grvpanchal

+0

@grvpanchal Nope中看到addtional「)」,所以代碼很好。 – Benjamin

回答

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" => ""]; 
}); 
+0

聰明。謝謝! – Benjamin