【问题标题】:PHP "Scope blocks"PHP“范围块”
【发布时间】:2014-01-16 17:21:45
【问题描述】:

是否可以在 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 的范围似乎仅限于函数。谢谢!
  • 或使用数组表示法。至少你会看到变量来自哪里。更喜欢更简洁的代码。
  • @KarolyHorvath 通常我会,但是 PDO 使用字符串连接数据库的奇怪语法会导致:"mysql:host=".$db["server"].";dbname=".$db["database"]bleh
  • 你也可以使用常量,不需要函数

标签: php scope


【解决方案1】:

由于PHP >= 5.3,您可以像这样使用Namespaces:

// per file
namespace App\One
$var = 1;

// or, per block
namespace App\Two {
    $var = 2;
}

然后你可以这样称呼它——还有其他方法:

echo \App\Two\var;

更新

嗯,variables 似乎不受namespace 的影响。

尽管任何有效的 PHP 代码都可以包含在命名空间中,但只有以下类型的代码受命名空间影响:类(包括抽象和特征)、接口、函数和常量。

source

但是你仍然可以做的是使用 Constants 代替:

namespace App\One;
define('App\One\ABC', 'abc');            // specified namespace
define(__NAMESPACE__ . '\XYZ', 'xyz');   // current namespace -- which is App\One here

【讨论】:

  • 我想这是限制 PHP 范围的唯一方法...谢谢!
  • 没有。变量aren't 绑定到命名空间。
  • @mario 感谢 mario 的更正,我不知道。我也更新了答案。
猜你喜欢
  • 1970-01-01
  • 2013-08-05
  • 2015-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-21
  • 2014-10-03
  • 2011-02-10
相关资源
最近更新 更多