【发布时间】:2011-07-14 07:48:34
【问题描述】:
PHP 命名空间可以包含变量吗?如果可以,如何实现?
【问题讨论】:
-
你试过了吗?如果你尝试过,结果如何?
-
@Charles 或者他可以问,得到一个正确的答案并帮助未来的读者......而不是每个人都必须自己“尝试”。
标签: php variables namespaces
PHP 命名空间可以包含变量吗?如果可以,如何实现?
【问题讨论】:
标签: php variables namespaces
您可以通过将变量包装在函数中来将变量绑定到命名空间。
<?php
namespace furniture;
// instead of declaring a $version global variable, wrap it inside a function
function version(){
return "1.3.4";
}
?>
【讨论】:
这是不可能的,因为$MYVARNAME 仍在全局范围内。试试下面的代码。
namespace.php
<?php
namespace MYNAME;
use MYNAME as M;
const MYVAR = 'MYVARNAME';
${M\MYVAR} = date('Y');
echo $MYVARNAME; // PRINT YEAR
$MYVARNAME = 'X';
echo $MYVARNAME; // PRINT X
echo ${M\MYVAR} ; // PRINT X
include('file.php');
?>
file.php
<?php
${MYNAME\MYVAR}=date('Y');
echo $MYVARNAME; // PRINT YEAR
$MYVARNAME = 'X';
echo $MYVARNAME; // PRINT X
echo ${MYNAME\MYVAR}; // PRINT X
include('file2.php');
?>
file2.php
<?php
namespace MYNAME2;
use MYNAME2 as N;
const MYVAR = 'MYVARNAME';
${N\MYVAR} = 'Y';
echo $MYVARNAME; // PRINT Y
echo ${MYNAME\MYVAR}; /* PRINT Fatal error: Uncaught Error:
Undefined constant 'MYNAME2\MYNAME\MYVAR' */
?>
【讨论】:
将完整的 classPath 存储在变量中并在“新”之后使用。
意识到反斜杠在字符串中用作转义字符非常重要,因此在字符串中使用时应始终加倍。
<?php
$a = "namespace\\className"; // 'which will print namespace/className'
$obj = new $a;
?>
【讨论】:
可以做到——差不多。
这可能非常糟糕并且永远不应该这样做,但可以通过使用variable variables 和magic constant 作为命名空间来实现。 所以一个字符串变量来命名我们想要使用的变量,像这样:
<?php
namespace your\namespace;
$varname = __NAMESPACE__.'\your_variablename'; //__NAMESPACE__ is a magic constant
$namespaced_variable = $$varname; //Note the double dollar, a variable variable
?>
【讨论】:
Can PHP namespaces contain variables? 而不是Can PHP variables contain namespaces?
试试这个
<?php
namespace App\login;
$p = 'login';
$test2 = '\App\\'.$p.'\\MyClass';
$test = new $test2;
【讨论】:
不他们不能,正如马里奥所说。
要封装变量,请使用类。绝对应该避免污染全局变量空间。
例子
class_dbworker.php:
class DbWorker
{
//properties and method logic
}
class DbWorkerData
{
public static $hugerelationsmap = array(....);
public static ....
}
mainapp.php:
include_once 'class_dbworker.php';
print_r( DbWorkerData::$hugerelationsmap );
使用命名空间的示例
class_dbworker.php:
namespace staticdata;
class DbWorker
{
//properties and method logic
}
class DbWorkerData
{
public static $hugerelationsmap = array(....);
public static ....
}
mainapp.php:
include_once 'class_dbworker.php';
use staticdata as data;
print_r( \data\DbWorkerData::$hugerelationsmap );
【讨论】:
没有。您可以在声明命名空间后设置变量,但变量将始终存在于全局范围内。它们永远不会绑定到名称空间。您可以从
中没有任何名称解析描述来推断也不允许在命名空间中定位变量的语法。
print \namespace\$var; // syntax error
print "${namespace\\var}"; // "unexpected T_NS_SEPARATOR"
【讨论】: