PHP 命名空间是否能包含变量?如果可以,如何实现?
PHP 命名空间是否能包含变量?如果可以,如何实现?
print \namespace\$var; // syntax error
print "${namespace\\var}"; // "unexpected T_NS_SEPARATOR"
试试这个
<?php
namespace App\login;
$p = 'login';
$test2 = '\App\\'.$p.'\\MyClass';
$test = new $test2;
\\
的规则是什么? - Istiaque Ahmed\
。 - Fuseteam不能,正如Mario所说。
为了封装变量,请使用类。绝对应该避免污染全局变量空间。
示例
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 );
通过将变量包装在函数内部,您可以将变量绑定到命名空间。
<?php
namespace furniture;
// instead of declaring a $version global variable, wrap it inside a function
function version(){
return "1.3.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' */
?>
让代码更有组织的替代方法:
而不是像\view\header\$links这样:
(1) 数组键中使用反斜杠进行虚拟嵌套,例如:
$myVar['view\header\links'] = 'value';
// OR use multidimentional arrays
$view['header']['links'] = 'value';
(1.1) 使用全局数组,示例
// START - SETUP
define('I', 'mySite_19582730');
// END - SETUP
// Usage:
$GLOBALS[I]['view\header\links'] = 'value';
// OR
$GLOBALS[I]['view__header__links'] = 'value';
(1.1.1) 获取和设置全局数组中的值的函数
function set($key, $val){
if (is_string($key)) $GLOBALS['site_8619403725'][$key] = $val;
elseif (is_array($key)){
foreach($key as $ky => &$vl) {
$GLOBALS['mySite_19582730'][$vl] = $val;
}
}
}
function get($key){
return @ $GLOBALS['mySite_19582730'][$key];
}
// Usage
set('view\header\search','<div></div>');
set(['view\header\logo','view\header\homeLink'], '<a href=""></a>');
get('view\header\search');
(2) 在变量名中使用 __(双下划线)来表示虚拟嵌套, 例如:
$view__header__links = 'value';
将完整的类路径存储在变量中,并在“new”后使用。
非常重要的是要意识到,由于反斜杠在字符串内用作转义字符,因此在字符串内部使用时应始终加倍。
<?php
$a = "namespace\\className"; // 'which will print namespace/className'
$obj = new $a;
?>