是否可以执行类似于 C#(以及可能其他)中的
using
关键字的操作来限制变量范围?我正在尝试数据库连接模式,目前正在尝试使其发挥作用:
$db = array(
"server" =>"localhost",
"user" =>"root",
"pass" =>"my_password",
"database" =>"my_database"
);
$pdo = null;
{ // ??? These seem to be completely ignored, no errors, no effect at all
extract($db);
$pdo = new PDO("mysql:host=$server;dbname=$database", $user, $pass);
}
//Do database stuff
我正在使用
extract
,这通常是一个坏主意,所以我试图保护它返回的大括号所在的位置。在 C# 中,我可能可以做一些 like using (extract($db)) { ... }
的事情,而无论 extract
返回的内容都将仅限于该范围,但我不知道这在 PHP 中是否可行。我什至不确定 PHP 是否处理变量。
非常感谢对此问题的任何见解!
从
PHP >= 5.3
开始,您可以像这样使用命名空间:
// per file
namespace App\One
$var = 1;
// or, per block
namespace App\Two {
$var = 2;
}
然后你可以这样称呼它——还有其他方式:
echo \App\Two\var;
更新
嗯,看来
variables
不受namespace
影响。
虽然任何有效的 PHP 代码都可以包含在命名空间中,但只有以下类型的代码受命名空间影响:类(包括抽象和特征)、接口、函数和常量。
但是你仍然可以做的是使用 Constants 代替:
namespace App\One;
define('App\One\ABC', 'abc'); // specified namespace
define(__NAMESPACE__ . '\XYZ', 'xyz'); // current namespace -- which is App\One here
如有必要,可以使用 IIFE 或“立即调用函数表达式”来代替代码块 - 如果非常必要,它们也可以在 PHP 中使用 - 它们不仅仅适用于 JavaScript:
https://en.wikipedia.org/wiki/Immediately_invoked_function_expression
$x = 1; // global var
$y = 2; // global var
echo "x={$x}, y={$y}\n";
// PHP 5.3+
call_user_func(function()use( & $x ){
$x = 33; // reference to the global var because use( & $x )
$y = 44; // local var
echo "x={$x}, y={$y}\n";
});
// PHP 7+
(function()use( & $x ){
$x = 555; // reference to the global var because use( & $x )
$y = 666; // local var
echo "x={$x}, y={$y}\n";
})();
echo "x={$x}, y={$y}\n";
输出:
x=1, y=2 // initial global var values
x=33, y=44 // inside the first PHP5.3+ iife
x=555, y=666 // inside the second PHP7+ iife
x=555, y=2 // the global variables after executing both
另外,一张不相关的图片鼓励模组离开正在下沉的船: