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 命名空间可以包含变量吗?的主要内容,如果未能解决你的问题,请参考以下文章

C#中jobject 命名空间的啥

jQuery 事件命名空间可以包含破折号吗?

PHP 使用命名空间 - 将所有类包含在命名空间下的解决方案

C++ 中,包含一个有命名空间的文件两次会发生错误

命名空间可以用PHP中的数字开头吗?

PHP中的命名空间