PHP 命名空间可以包含变量吗?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/5287315/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Can PHP namespaces contain variables?
提问by EmpireJones
Can PHP namespaces contain variables? If so, how can this be accomplished?
PHP 命名空间可以包含变量吗?如果是这样,如何实现?
采纳答案by mario
No. You can set a variable after declaring a namespace, but variables will always exist in the global scope. They are never bound to namespaces. You can deduce that from the absence of any name resolution descriptions in
不可以。您可以在声明命名空间后设置变量,但变量将始终存在于全局范围内。它们永远不会绑定到命名空间。你可以从没有任何名称解析描述中推断出
- FAQ: things you need to know about namespaces(PHP 5 >= 5.3.0)
- FAQ:关于命名空间你需要知道的事情(PHP 5 >= 5.3.0)
There would also be no allowed syntax to locate variables in a namespace.
也不允许使用语法在命名空间中定位变量。
print \namespace$var; // syntax error
print "${namespace\var}"; // "unexpected T_NS_SEPARATOR"
回答by Maxim
Try this
尝试这个
<?php
namespace App\login;
$p = 'login';
$test2 = '\App\'.$p.'\MyClass';
$test = new $test2;
回答by Lorenz Lo Sauer
Nothey cannot, as mario said.
不,他们不能,正如马里奥所说。
To encapsulate variables use Classes. Polluting the global variable space should definitely be avoided.
要封装变量,请使用Classes。绝对应该避免污染全局变量空间。
Example
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 );
Example using namespaces
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 );
例子
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 );
回答by citygeist
NO IT IS NOT POSSIBLE TRY THIS AND YOU SEE WHY, $MYVARNAMEIS STILL in THE GLOBAL SCOPE
不,这是不可能的,试试这个,你就会明白为什么,$MYVARNAME仍然在全球范围内
namespace.php
命名空间.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
<?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 **
**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' */
?>
回答by JohnF
It can be done - sort of.
这是可以做到的 - 有点。
This is probably extremely bad and should never be done, but it is possible by using variable variables, and the magic constantfor namespace. So a string-variable to name the variable we want to use, like so:
这可能非常糟糕,永远不应该这样做,但可以通过使用变量 variables和命名空间的魔术常量。所以一个字符串变量来命名我们想要使用的变量,如下所示:
<?php
namespace your\namespace;
$varname = __NAMESPACE__.'\your_variablename'; //__NAMESPACE__ is a magic constant
$namespaced_variable = $$varname; //Note the double dollar, a variable variable
?>