<?php
namespace Foo;
function strlen() {}
const INI_ALL = 3;
class Exception {}
$a = strlen('hi'); // 调用全局函数strlen
$b = INI_ALL; // 访问全局常量 INI_ALL
$c = new Exception('error'); // 实例化全局类 Exception
?>
命名空间和动态语言特征
PHP 命名空间的实现受到其语言自身的动态特征的影响。因此,如果要将下面的代码转换到命名空间中,动态访问元素。
example1.php 文件代码:
<?php
class classname
{
function __construct()
{
echo __METHOD__,"n";
}
}
function funcname()
{
echo __FUNCTION__,"n";
}
const constname = "global";
$a = 'classname';
$obj = new $a; // prints classname::__construct
$b = 'funcname';
$b(); // prints funcname
echo constant('constname'), "n"; // prints global
?>
必须使用完全限定名称(包括命名空间前缀的类名称)。注意因为在动态的类名称、函数名称或常量名称中,限定名称和完全限定名称没有区别,因此其前导的反斜杠是不必要的。
动态访问命名空间的元素
<?php
namespace namespacename;
class classname
{
function __construct()
{
echo __METHOD__,"n";
}
}
function funcname()
{
echo __FUNCTION__,"n";
}
const constname = "namespaced";
include 'example1.php';
$a = 'classname';
$obj = new $a; // 输出 classname::__construct
$b = 'funcname';
$b(); // 输出函数名
echo constant('constname'), "n"; // 输出 global
/* 如果使用双引号,使用方法为 "namespacenameclassname"*/
$a = 'namespacenameclassname';
$obj = new $a; // 输出 namespacenameclassname::__construct
$a = 'namespacenameclassname';
$obj = new $a; // 输出 namespacenameclassname::__construct
$b = 'namespacenamefuncname';
$b(); // 输出 namespacenamefuncname
$b = 'namespacenamefuncname';
$b(); // 输出 namespacenamefuncname
echo constant('namespacenameconstname'), "n"; // 输出 namespaced
echo constant('namespacenameconstname'), "n"; // 输出 namespaced
?>
namespace关键字和__NAMESPACE__常量
PHP支持两种抽象的访问当前命名空间内部元素的方法,__NAMESPACE__ 魔术常量和namespace关键字。
常量__NAMESPACE__的值是包含当前命名空间名称的字符串。在全局的,不包括在任何命名空间中的代码,它包含一个空的字符串。
__NAMESPACE__ 示例, 在命名空间中的代码
<?php namespace MyProject; echo '"', __NAMESPACE__, '"'; // 输出 "MyProject" ?>
__NAMESPACE__ 示例,全局代码
<?php echo '"', __NAMESPACE__, '"'; // 输出 "" ?>
常量 __NAMESPACE__ 在动态创建名称时很有用,例如:
使用__NAMESPACE__动态创建名称
<?php
namespace MyProject;
function get($classname)
{
$a = __NAMESPACE__ . '' . $classname;
return new $a;
}
?>







