命名空间 PHP 命名空间(namespace)是在PHP 5.3中加入的,如果你学过C#和Java,那命名空间就不算什么新事物。 不过在PHP当中还是有着相当重要的意义。 PHP 命名空间可以解决以下两类问题: 用户代码与PHP内部的类/函数/常量之间的名字冲突。 创建别名(或简短)的名称,提高源代码的可读性。 默认情况下,所有常量、类和函数名都放在全局空间下,就和PHP支持命名空间之前一样。 如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间
< ?php // 定义代码在 MyProject 命名空间中 namespace MyProject;
// ... 代码 ...
//也可以在同一个文件中定义不同的命名空间代码namespace MyProject1; // MyProject1 命名空间中的PHP代码
namespace MyProject2; // MyProject2 命名空间中的PHP代码
// 另一种语法namespace MyProject3 {
// MyProject3 命名空间中的PHP代码
}
?>
在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前。
<?phpdeclare(encoding=UTF-8); //定义多个命名空间和不包含在命名空间中的代码namespace MyProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
namespace { // 全局代码
session_start();
$a = MyProjectconnect();
echo MyProjectConnection::start();
}?>
以下代码会出现语法错误:
<html><?phpnamespace MyProject; // 命名空间前出现了“<html>” 会致命错误 - 命名空间必须是程序脚本的第一条语句?>
子命名空间
<?phpnamespace MyProjectSubLevel; //声明分层次的单个命名空间//创建了常量 MyProjectSubLevelCONNECT_OK,//类 MyProjectSubLevelConnection //和函数 MyProjectSubLevelConnect。
const CONNECT_OK = 1;class Connection { /* ... */ }function Connect() { /* ... */ }
?>
命名空间使用 PHP 命名空间中的类名可以通过三种方式引用: 非限定名称,或不包含前缀的类名称,例如 $a=new foo(); 或 foo::staticmethod();。如果当前命名空间是 currentnamespace,foo 将被解析为 currentnamespacefoo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,则 foo 会被解析为foo。 警告:如果命名空间中的函数或常量未定义,则该非限定的函数名称或常量名称会被解析为全局函数名称或常量名称。~~无命名空间前缀的引用,默认在当前命名空间查找,然后到全局命名空间找 限定名称,或包含前缀的名称,例如 $a = new subnamespacefoo(); 或 subnamespacefoo::staticmethod();。如果当前的命名空间是 currentnamespace,则 foo 会被解析为 currentnamespacesubnamespacefoo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,foo 会被解析为subnamespacefoo。 ~~带相对命名空间前缀的(类似相对路径)引用,自动在开头添加调用代码所处的命名空间 完全限定名称,或包含了全局前缀操作符的名称,例如, $a = new currentnamespacefoo(); 或 currentnamespacefoo::staticmethod();。在这种情况下,foo 总是被解析为代码中的文字名(literal name)currentnamespacefoo。~~带绝对命名空间前缀的引用(类似绝对路径) 引用路径已明确 不用查找
file1.php<?phpnamespace FooBarsubnamespace;
const FOO = 1;function foo() {}class foo{
static function staticmethod() {}
}?>
file2.php<?phpnamespace FooBar;include file1.php;
const FOO = 2;function foo() {}class foo{
static function staticmethod() {}
}
/* 非限定名称 */
foo(); // 解析为函数 FooBarfoo
foo::staticmethod(); // 解析为类 FooBarfoo的静态方法staticmethod。echo FOO; // resolves to constant FooBarFOO
/* 限定名称 */
subnamespacefoo(); // 解析为函数 FooBarsubnamespacefoo
subnamespacefoo::staticmethod(); // 解析为类 FooBarsubnamespacefoo,
// 以及类的方法 staticmethodecho subnamespaceFOO; // 解析为常量 FooBarsubnamespaceFOO
/* 完全限定名称 */
FooBarfoo(); // 解析为函数 FooBarfoo
FooBarfoo::staticmethod(); // 解析为类 FooBarfoo, 以及类的方法 staticmethodecho FooBarFOO; // 解析为常量 FooBarFOO?>
在命名空间内部访问全局类、函数和常量:
<?phpnamespace Foo;
function strlen() {}const INI_ALL = 3;class Exception {}
$a = strlen(hi); // 调用全局函数strlen
$b = INI_ALL; // 访问全局常量 INI_ALL
$c = new Exception(error); // 实例化全局类 Exception?>
命名空间和动态语言特征 PHP 命名空间的实现受到其语言自身的动态特征的影响。因此,如果要将下面的代码转换到命名空间中,动态访问元素。 //example.php
<?phpclass classname{
function __construct()
{
echo __METHOD__," ";
}
}function funcname(){
echo __FUNCTION__," ";
}const constname = "global";
$a = classname;
$obj = new $a; // prints classname::__construct
$b = funcname;
$b(); // prints funcnameecho constant(constname), " "; // prints global?>
<?phpnamespace namespacename;class classname{
function __construct()
{
echo __METHOD__," ";
}
}function funcname(){
echo __FUNCTION__," ";
}const constname = "namespaced";
include example1.php;//全局命名空间和某个命名空间有相同类 函数 和 常量 分别区别访问
$a = classname;
$obj = new $a; // prints classname::__construct
$b = funcname;
$b(); // prints funcnameecho constant(constname), " "; // prints global
/* note that if using double quotes, "\namespacename\classname" must be used */
$a = amespacenameclassname;
$obj = new $a; // prints namespacenameclassname::__construct
$a = namespacenameclassname;
$obj = new $a; // also prints namespacenameclassname::__construct
$b = namespacenamefuncname;
$b(); // prints namespacenamefuncname
$b = amespacenamefuncname;
$b(); // also prints namespacenamefuncnameecho constant( amespacenameconstname), " "; // prints namespacedecho constant(namespacenameconstname), " "; // also prints namespaced?>
namespace关键字和NAMESPACE常量
<?phpnamespace MyProject;
echo ", __NAMESPACE__, "; // 输出 "MyProject"?><?php
echo ", __NAMESPACE__, "; // 输出 ""?>
使用__NAMESPACE__动态创建名称<?phpnamespace MyProject;
function get($classname){
$a = __NAMESPACE__ . \ . $classname;
return new $a;
}?>
关键字 namespace 可用来显式访问当前命名空间或子命名空间中的元素。它等价于类中的 self 操作符。
<?phpnamespace MyProject;
use blahblah as mine; // see "Using namespaces: importing/aliasing"
blahmine(); // calls function blahlahmine()namespaceblahmine(); // calls function MyProjectlahmine()
namespacefunc(); // calls function MyProjectfunc()namespacesubfunc(); // calls function MyProjectsubfunc()namespacecname::method(); // calls static method "method" of class MyProjectcname
$a = new namespacesubcname(); // instantiates object of class MyProjectsubcname
$b = namespaceCONSTANT; // assigns value of constant MyProjectCONSTANT to $b?>
版权声明:
—— 本文内容由互联网用户自发贡献, 本站不拥有所有权, 不承担相关法律责任, 如果发现本站有涉嫌抄袭的内容, 欢迎发送邮件至 :
—— 1034252225@qq.com 举报, 并提供相关证据, 一经查实, 本站将立刻删除涉嫌侵权内容。