<?php
namespace MyProject {
namespace Database {
class Connection { }
}
}
从命名空间中调用代码
如果你想在不同的命名空间中实例化一个类、调用一个函数或者使用常量,需要使用反斜线\。他们可以从三个角度被解析:
1.未限定的名字
2.限定的名字
3.完全限定的名字
未限定的名字(Unqualified Name)
这是一个类的名称,函数或常量,但是不包括任何命名的引用。如果命名空间对你来说还比较陌生,那么这就是你熟悉的角度。
复制代码 代码如下:
<?php
namespace MyProject;
class MyClass {
static function static_method()
{
echo 'Hello, world!';
}
}
// Unqualified name, resolves to the namespace you are currently in (MyProject\MyClass)
MyClass:static_method();
限定的名字(Qualified Name)
这是我们如何使用子命名空间的方式。示例如下:
复制代码 代码如下:
<?php
namespace MyProject;
require 'myproject/database/connection.php';
// Qualified name, instantiating a class from a sub-namespace of MyProject
$connection = new Database\Connection();
完全限定的名字(Fully Qualified Name)
前面所说的使用限定的名字和未限定的名字,都是相对于当前所处的命名空间来说的。以上两种方式仅可以被用来访问当前所处的命名空间和更深层次的子命名空间。
如果想访问一个在比前命名空间更高的层级,那么就需要使用完全限定的名字—一个绝对路径而不是相对路径。这可以归结为在命名空间的最前面加反斜杠\。使用完全限定的名字可以让PHP知道,这次调用是从全局空间开始的,而不是相对于当前所处的命名空间。示例如下:
复制代码 代码如下:
<?php
namespace MyProject\Database;
require 'myproject/fileaccess/input.php';
// Trying to access the MyProject\FileAccess\Input class
// This time it will work because we use the fully qualified name, note the leading backslash
$input = new \MyProject\FileAccess\Input();
对于PHP的内部函数来说,我们不必要使用完全限定的名字。在当前所处的命名空间中,调用一个不存在的未限定的名字的类或函数,PHP会搜索全局空间。
记住了这个规则,我们就可以像下面那样重写PHP的内部函数:
复制代码 代码如下:
<?php
namespace MyProject;
var_dump($query); // Overloaded
\var_dump($query); // Internal
// We want to access the global Exception class
// The following will not work because there's no class called Exception in the MyProject\Database namespace and unqualified class names do not have a fallback to global space
// throw new Exception('Query failed!');
// Instead, we use a single backslash to indicate we want to resolve from global space
throw new \Exception('ailed!');
function var_dump() {
echo 'Overloaded global var_dump()!<br />';
}
动态调用
PHP是一门动态语言,也可以将PHP的这种特性用来调用命名空间。这在本质上与实例化一个变量类和包含一个变量文件是相同的。在字符串中,PHP使用的命名空间分隔符(\)也是一个元字符,因此需要转义。
复制代码 代码如下:
<?php
namespace OtherProject;
$project_name = 'MyProject';
$package_name = 'Database';
$class_name = 'Connection';
// Include a variable file
require strtolower($project_name . 'https://www.jb51.net/'. $package_name . 'https://www.jb51.net/' . $class_name) . '.php';
// Name of a variable class in a variable namespace. Note how the backslash is escaped to use it properly
$fully_qualified_name = $project_name . '\\' . $package_name . '\\' . $class_name;
$connection = new $fully_qualified_name();