Может ли пространство имен PHP содержать переменные? Если да, то как это можно сделать?
Могут ли пространства имен PHP содержать переменные?
Ответ 1
Нет. Вы можете установить переменную после объявления пространства имен, но переменные всегда будут существовать в глобальной области. Они никогда не привязаны к пространствам имен. Вы можете сделать вывод, что из-за отсутствия описания описания имен в
- Часто задаваемые вопросы: что вам нужно знать о пространствах имен (PHP 5 >= 5.3.0)
Также не было бы разрешенного синтаксиса для поиска переменных в пространстве имен.
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