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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 20:52:36  来源:igfitidea点击:

Can PHP namespaces contain variables?

phpvariablesnamespaces

提问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

不可以。您可以在声明命名空间后设置变量,但变量将始终存在于全局范围内。它们永远不会绑定到命名空间。你可以从没有任何名称解析描述中推断出

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
?>