首页 > 开发 > PHP > 正文

PHP关键特性之命名空间实例详解

2024-05-04 22:47:45
字体:
来源:转载
供稿:网友

命名空间主要是为了解决代码中类和函数可能存在冲突的问题,而这个特性其他语言一早就有,PHP则是姗姗来迟,它的出现催生了 PSR-4 的诞生,从而也催生了 Composer 的兴起,所以是非常重要的特性。

命名空间的定义

命名空间是一个容器,这个容器主要是为了识别其下的类和函数。一旦定义了命名空间,它下面的代码就属于这个命名空间了,所以命名空间的定义要在代码的最开始行。

对于同一个包来说,同一个命名空间或者子命名空间的代码没有必要在一个 PHP 文件中定义,子命名空间下的代码是为了完成特定模块的工作,组合起来就是一个包完整的命名空间。

假如编写的代码没有定义命名空间,那说明它属于全局的命名空间(/ 符号),所以能够直接引用类或者函数(不用添加 / 符号)。

引用命名空间标识符的三种方式

(1)Fully-qualified name

类似于操作系统上的绝对路径,而且是完整的路径,所以在理解的时候不会有误解。

比如在 new /A/B/C ,那么 C 就被会解析到 A/B 命名空间下的 C 类。

(2)Qualified name

类似于操作系统上的相对路径,它包含部分名字并被引用到当前的命名空间。

比如 B/C() 在命名空间 A 下调用,则最终引用的命名空间就是 A/B/C()。

(3)Unqualified name

类似于Qualified name,但是没包括子命名空间。

比如 C() 在命名空间 A/B 下调用,则最终引用的命名空间就是 A/B/C()。

通过一个例子来说明三种引用方式:

namespace /Example;require_once "fnction.php";class ClassA {}function Function() {}//完全限定名称/Example/Function();/Example/B/Function(); //限定名称B/Function(); //指向 /Example/B/Function();//非限定名称$test = new ClassA(); //resolves to /Example/ClassAFunction(); //指向 /Example/Function

注意:

•Inside a namespace,假如在 current scope 没有发现函数和常量的定义,PHP 不会报错。而是去全局命名空间中寻找。

•Inside a namespace,假如在 current scope 没有发现类的定义,则 PHP 会直接报错,不会去全局域中找对应的类,所以假如你需要引用一个 internal 或用户自定义的类,必须使用完全限定名称。

先举个简单的例子,首先编写一段代码(定义在命名空间下),命名为 function.php :

namespace Foo/Bar/subnamespace;const FOO = 1;function foo() {  return "foo/r/n";}class foo {  static function staticmethod()  {    return __METHOD__ . "/r/n" ;  }  function foofunction()  {    return __METHOD__ . "/r/n" ;  }}

再编写一段代码 test.php,也是处于命名空间之下的代码:

namespace secondsp;include 'function.php';class foo{  function foofunction()  {    return __METHOD__ . "/r/n" ;  }}function is_file($file){  return true ;}//非限定名称:实例化secondsp/foo类对象$obj = new foo; echo $obj->foofunction();//实例化Foo/Bar/subnamespace/foo 类对象$obj = new Foo/Bar/subnamespace/foo ;echo $obj->foofunction();//代码会报错,在命名空间内部,假如无法找到当前命名空间下的类,则会报错//$obj = new ArrayObject(array(1)); $obj = new /ArrayObject(array(1)); //在命名空间内部,假如无法找到当前命名空间下的函数或者常量,则会寻找 native functionecho strlen("nihao"); //引用当前命名空间下的函数var_dump(is_file('nihao')); //True//引用全局函数var_dump(/is_file('nihao')); //False            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表