PHP 命名空间可以包含变量吗?
Posted
技术标签:
【中文标题】PHP 命名空间可以包含变量吗?【英文标题】:Can PHP namespaces contain variables? 【发布时间】:2011-07-14 07:48:34 【问题描述】:如果可以,如何实现?
【问题讨论】:
你试过了吗?如果你尝试过,结果如何? @Charles 或者他可以问,得到一个正确的答案并帮助未来的读者......而不是每个人都必须自己“尝试”。 【参考方案1】:您可以通过将变量包装在函数中来将变量绑定到命名空间。
<?php
namespace furniture;
// instead of declaring a $version global variable, wrap it inside a function
function version()
return "1.3.4";
?>
【讨论】:
【参考方案2】:这是不可能的,因为$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' */
?>
【讨论】:
【参考方案3】:将完整的 classPath 存储在变量中并在“新”之后使用。
意识到反斜杠在字符串中用作转义字符非常重要,因此在字符串中使用时应始终加倍。
<?php
$a = "namespace\\className"; // 'which will print namespace/className'
$obj = new $a;
?>
【讨论】:
【参考方案4】:可以做到——差不多。
这可能非常糟糕并且永远不应该这样做,但可以通过使用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?
【参考方案5】:
试试这个
<?php
namespace App\login;
$p = 'login';
$test2 = '\App\\'.$p.'\\MyClass';
$test = new $test2;
【讨论】:
命名空间必须是文件的第一行。不是吗? 这肯定有效,我这样使用它: $class= '\\'.$vendor.'\\'.$application.'\\Router';返回新的 $class(); 这里使用单或双`\`的规则是什么? @IstiaqueAhmed 我认为这里没有规则 \A 恰好不是转义字符。在这种情况下,无论哪种方式,总是逃避 `` 可能会更好【参考方案6】:不他们不能,正如马里奥所说。
要封装变量,请使用类。绝对应该避免污染全局变量空间。
例子
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 );
【讨论】:
【参考方案7】:没有。您可以在声明命名空间后设置变量,但变量将始终存在于全局范围内。它们永远不会绑定到名称空间。您可以从
中没有任何名称解析描述来推断 FAQ: things you need to know about namespaces (PHP 5 >= 5.3.0)也不允许在命名空间中定位变量的语法。
print \namespace\$var; // syntax error
print "$namespace\\var"; // "unexpected T_NS_SEPARATOR"
【讨论】:
以上是关于PHP 命名空间可以包含变量吗?的主要内容,如果未能解决你的问题,请参考以下文章