Могут ли пространства имен PHP содержать переменные? - PullRequest
52 голосов
/ 13 марта 2011

Могут ли пространства имен PHP содержать переменные?Если да, то как это можно сделать?

Ответы [ 5 ]

38 голосов
/ 13 марта 2011

Нет.Вы можете установить переменную после объявления пространства имен, но переменные всегда будут существовать в глобальной области видимости.Они никогда не связаны с пространствами имен.Это можно сделать из отсутствия описаний разрешения имен в

Также не будет разрешенного синтаксиса для поиска переменных в пространстве имен.

print \namespace\$var;      // syntax error

print "${namespace\\var}";  // "unexpected T_NS_SEPARATOR"
17 голосов
/ 13 марта 2012

Попробуйте это

<?php
namespace App\login; 

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

$test = new $test2;
11 голосов
/ 08 сентября 2013

Нет они не могут, как сказал Марио.

Для инкапсуляции переменных используйте Классы .Определенно следует избегать загрязнения пространства глобальной переменной.

  • Пример

    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 );
    
0 голосов
/ 02 августа 2016

Прошу не согласиться, основываясь на этом руководстве, МЫ МОЖЕМ .

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
0 голосов
/ 09 декабря 2015

Это можно сделать - вроде.

Это, вероятно, чрезвычайно плохо и никогда не должно выполняться, но это возможно при использовании переменных переменных и магической константы для пространства имен. Итак, строковая переменная для именования переменной, которую мы хотим использовать, например:

<?php
namespace your\namespace;

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