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

时间:2011-03-13 03:59:23

标签: php variables namespaces

PHP名称空间可以包含变量吗?如果是这样,怎么能实现呢?

7 个答案:

答案 0 :(得分:37)

没有。您可以在声明命名空间后设置变量,但变量将始终存在于全局范围中。它们永远不会绑定到名称空间。您可以从

中没有任何名称解析说明中推断出这一点

也没有允许在命名空间中定位变量的语法。

print \namespace\$var;      // syntax error

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

答案 1 :(得分:17)

试试这个

<?php
namespace App\login; 

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

$test = new $test2;

答案 2 :(得分:11)

他们不能,正如马里奥所说。

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

  • 实施例

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

答案 3 :(得分:0)

这不可能,您会发现为什么 $ 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' */

?>

答案 4 :(得分:0)

将完整的classPath存储在Variable中,并在“ new”之后使用。

认识到非常重要,因为反斜杠在字符串中用作转义字符,所以在字符串中使用反斜杠时应始终加倍。

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

答案 5 :(得分:-1)

可以做到 - 有点像。

这可能非常糟糕,永远不应该完成,但可以使用variable variablesmagic constant命名空间。 所以是一个字符串变量来命名我们想要使用的变量,如下所示:

<?php
namespace your\namespace;

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

答案 6 :(得分:-2)

我不同意本手册,我们

http://php.net/manual/en/language.namespaces.dynamic.php

<?php
namespace namespacename;

class classname
{
    function __construct()
    {
        echo __METHOD__,"\n";
    }
}


function funcname()
{
    echo __FUNCTION__,"\n";
}
const constname = "namespaced";

/* note that if using double quotes, "\\namespacename\\classname" must be used */
$a = '\namespacename\classname';
$obj = new $a; // prints namespacename\classname::__construct
$a = 'namespacename\classname';
$obj = new $a; // also prints namespacename\classname::__construct
$b = 'namespacename\funcname';
$b(); // prints namespacename\funcname
$b = '\namespacename\funcname';
$b(); // also prints namespacename\funcname
echo constant('\namespacename\constname'), "\n"; // prints namespaced
echo constant('namespacename\constname'), "\n"; // also prints namespaced