Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

print \namespace\$var;      // syntax error

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

Ответ 2

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

<?php
namespace App\login; 

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

$test = new $test2;

Ответ 3

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

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

  • Пример

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

Ответ 4

НИКТО НЕ МОЖЕТ ПОПРОБОВАТЬ ЭТО, И ВЫ ВИДИТЕ ПОЧЕМУ, $ 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' */

?>

Ответ 5

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

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

<?php
namespace your\namespace;

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

Ответ 6

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

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