PHP“范围块”

问题描述 投票:0回答:2

是否可以执行类似于 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 scope
2个回答
1
投票

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

0
投票

如有必要,可以使用 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

另外,一张不相关的图片鼓励模组离开正在下沉的船:
Ban pitbulls

© www.soinside.com 2019 - 2024. All rights reserved.