php命名空间学习详解
1、什么是命名空间? 代码如下: namespace MyProject; const CONNECT_OK = 1;//php5.3以后 class Connection { /* ... */ } function connect() { /* ... */ } #例子二 namespace MyProjectSubLevel; const CONNECT_OK = 1;//php5.3以后 class Connection { /* ... */ } function connect() { /* ... */ } 使用 `namespace 空间名` 来申明一个空间,在namespace之前除了declare语句不能有任何其他php语句,同时也不能有任何非php代码,连空格都不能有。 以下为错误的形式: 代码如下: $a = 1; namespace MyProject; ?>www.52php.cn //Fatal error: Namespace declaration statement has to be the very first statement in the script... 另外同一个命名空间是可以定义在多个文件中,这对于组织框架是非常有用的。即以同一个namespace MyProject;开头的文件,它们是同一个命名空间。所以注意文件之间可不要有相同的类/函数/常量名哦。 当然同一个文件也可以定义多个命名空间,不过非常不建议这样做的。(了解同一个文件定义多个命名空间) 5、命名空间如何使用 命名空间有三种使用形式: . 非限定名称 -- 没有使用任何的分割符,直接使用类/函数/常量名,如:new Foo(); foo(); echo FOO; 当文件有使用命名空间时, 代码如下: namespace MyObject; new Foo(); // 调用MyObjectFoo(); foo(); //调用MyObjectFoo(); echo FOO; //调用MyObjectFOO; 非完全限定名称 -- 不是以分割符开头,如 new SubFoo(); 这种形式与非限定名称方式一样。 代码如下: namespace MyObject; new SubFoo(); //调用MyObjectSubFoo(); 完全限定名称 -- 以分割符开头的方式,相当于操作系统里的绝对地址。如 new OtherNSFoo(); 代码如下: namespace MyObject; new OtherNSFoo(); //调用OtherNsFoo(); 不管MyObject命名空间。 Tip: 对于函数和常量,还有一个特殊的地方(后备全局函数/常量)。 代码如下: namespace MyObject; funcname(); //如果MyObjectFuncname存在则调用MyObjectFuncname(),否则试着调用funcname(); echo FOO; //同上。 对于类,也有一个特殊的地方。 代码如下: namespace MyObject; new Foo(); //*如果MyObjectFoo存在,调用之,如果不存在,调用__autoload试着加载MyObjectFoo类进来。 //注意对于类是不会去自动去调用全局作用域下的类的。 之前说了,命名空间还有一个用途-取别名。 代码如下: namespace MyObject; use OtherNSSub as Other; use OtherNSSub2; //相当于use OtherNSSub2 as Sub2; use /MyClass; new Foo(); //调用MyObjectFoo(); new OtherFoo(); //调用 OtherNSSubFoo(); new Sub2Foo(); //调用OtherNSSub2Foo(); new MyClass(); //调用MyClass(); 6、动态命名空间 动态总是能让人摸不着头脑,然而又带来灵活性。命名空间同样可以使用动态语言特点,但要注意由于直接调用命名空间是编译时解析的,而动态特征并非编译时解析。所以一定要加前缀。如: 代码如下: namespace MyObjectSub;
new Foo(); //调用 MyObjectSubFoo(),编译时已经解析成MyObjectSubFoo $a = 'Foo'; new $a(); //调用的是Foo(),而不是MyObjectSubFoo() $b = 'MyObjectSubFoo'; //等价于 MyObjectSubFoo new $b(); //调用MyObjectSubFoo() //如果使用双引号,要用,如 $a = "MyObjectSub"; 附1:同一个文件定义多个命名空间 代码如下: namespace MyProject;
const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } namespace AnotherProject; const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } 方法一,记流水帐。 代码如下: namespace MyProject {
const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } } namespace AnotherProject { const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } } namespace { //全局 const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } } 方法二,使用大括号把同一个命名空间的代码放在大括号里。这种方法,要求在大括号外不能有任何除了declare之外的代码。对于全局作用域的代码使用没有空间名的大括号包围起来。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |