PHP命名空间可以包含变量吗?

74

PHP 命名空间是否能包含变量?如果可以,如何实现?


7
你试过了吗?如果你试过了,结果怎样了? - Charles
3
@Charles 或者他可以询问,得到正确的答案并帮助未来的读者... 而不是每个人都必须“自己试一下”。 - I try so hard but I cry harder
8个回答

59
不行。你可以在声明命名空间后设置一个变量,但是变量始终存在于全局作用域中,而不是绑定到命名空间。这一点可以从缺乏任何名称解析描述中得出结论。此外,也不存在任何允许在命名空间中定位变量的语法。
print \namespace\$var;      // syntax error

print "${namespace\\var}";  // "unexpected T_NS_SEPARATOR"

27

试试这个

<?php
namespace App\login; 

$p = 'login';
$test2 = '\App\\'.$p.'\\MyClass';

$test = new $test2;

5
命名空间必须是文件的第一行。是这样吗? - xkeshav
这个肯定有效,我是这样使用的:$class = '\'.$vendor.'\'.$application.'\Router'; return new $class(); - joronimo
在这里使用单个或双个 \\ 的规则是什么? - Istiaque Ahmed
1
@IstiaqueAhmed 我认为这里没有规定\A不是转义字符,最好在这种情况下无论如何都要转义\ - Fuseteam
2
非常感谢您对结果的解释。 - PhoneixS

18

不能,正如Mario所说。

为了封装变量,请使用。绝对应该避免污染全局变量空间。

  • 示例

    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 );
    

  • 2

    通过将变量包装在函数内部,您可以将变量绑定到命名空间。

    <?php
     namespace furniture;
    // instead of declaring a $version global variable, wrap it inside a function
    function version(){
     return "1.3.4";
    }
    ?>
    

    1

    不可能实现,因为$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' */
    ?>
    

    0

    这是可以做到的 - 有点像。

    这可能非常糟糕,不应该这样做,但是通过使用变量变量命名空间的魔术常量,是可能的。 因此,我们可以使用字符串变量来命名我们想要使用的变量,就像这样:

    <?php
    namespace your\namespace;
    
    $varname = __NAMESPACE__.'\your_variablename'; //__NAMESPACE__ is a magic constant
    $namespaced_variable = $$varname; //Note the double dollar, a variable variable
    ?>
    

    9
    问题是“PHP 命名空间能包含变量吗?”,而不是“PHP 变量能包含命名空间吗?” - Lorenz Lo Sauer

    0

    让代码更有组织的替代方法:

    而不是像\view\header\$links这样:

    (1) 数组键中使用反斜杠进行虚拟嵌套,例如:

    $myVar['view\header\links'] = 'value';
    
    // OR use multidimentional arrays
    
    $view['header']['links'] = 'value';
    

    (1.1) 使用全局数组,示例

    // START - SETUP
    
    define('I', 'mySite_19582730');
    
    // END - SETUP
    
    
    // Usage:
    
    $GLOBALS[I]['view\header\links'] = 'value';
    
    // OR
    
    $GLOBALS[I]['view__header__links'] = 'value';
    

    (1.1.1) 获取和设置全局数组中的值的函数

    function set($key, $val){
        if (is_string($key)) $GLOBALS['site_8619403725'][$key] = $val;
        elseif (is_array($key)){
            foreach($key as $ky => &$vl) {
                $GLOBALS['mySite_19582730'][$vl] = $val;
            }
        }
    }
    
    function get($key){
        return @ $GLOBALS['mySite_19582730'][$key];
    }
    
    // Usage
    
    set('view\header\search','<div></div>');
    set(['view\header\logo','view\header\homeLink'], '<a href=""></a>');
    get('view\header\search');
    

    (2) 在变量名中使用 __(双下划线)来表示虚拟嵌套, 例如:

    $view__header__links = 'value';
    

    0

    将完整的类路径存储在变量中,并在“new”后使用。

    非常重要的是要意识到,由于反斜杠在字符串内用作转义字符,因此在字符串内部使用时应始终加倍。

    <?php
    $a = "namespace\\className"; // 'which will print namespace/className'
    $obj = new $a;
    ?>
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接