加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_新乡站长网 (https://www.0373zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php 命名空间实例详解

发布时间:2022-11-11 10:51:18 所属栏目:PHP教程 来源:
导读:  PHP 命名空间(namespace)是在PHP 5.3中加入的,如果你学过C#和Java,那命名空间就不算什么新事物。 不过在PHP当中还是有着相当重要的意义。

  PHP 命名空间可以解决以下两类问题:

  用户编写的代码
  PHP 命名空间(namespace)是在PHP 5.3中加入的,如果你学过C#和Java,那命名空间就不算什么新事物。 不过在PHP当中还是有着相当重要的意义。
 
  PHP 命名空间可以解决以下两类问题:
 
  用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
 
  为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
 
  定义命名空间
 
  默认情况下,所有常量、类和函数名都放在全局空间下,就和PHP支持命名空间之前一样。
 
  命名空间通过关键字namespace 来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间。
 
  引用命名空间标识符的三种方式
 
  (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\ClassA
  Function(); //指向 \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 function
  echo strlen("nihao");
   //引用当前命名空间下的函数
  var_dump(is_file('nihao')); //True
  //引用全局函数
  var_dump(\is_file('nihao')); //False
  登录后复制
 
  导入,别名
 
  假如要使用的命名空间层级很长且数量很多PHP命名空间,那么在使用的时候特别麻烦,所以可以使用 use 关键字导入命名空间、类、常量、函数等,然后可以使用它们直接引用完整的名称。而 alias 关键字可以给导入的类和函数等重命名。
 
  举个例子如何使用 use 关键字,该代码处于全局命名空间之下:
 
  include 'function.php';
  use Foo\Bar\subnamespace\foo ;
  $obj = new foo;
  echo $obj->foofunction();
  use Foo\Bar\subnamespace\foo as aliasfunname;
  $obj = new aliasfunname;
  echo $obj->foofunction();
  use Foo\Bar\subnamespace ;
  $obj = new subnamespace\foo ;
  echo $obj->foofunction();
  use Foo\Bar\subnamespace as aliasname;
  $obj = new aliasname\foo ;
  echo $obj->foofunction();
  //由于调用代码并不在命名空间内,所以对于全局的类,无需引入使用
  $obj = new ArrayObject(array(1));
  //导入一个函数
  use function Foo\Bar\subnamespace\foo  ;
  echo foo();
  use function Foo\Bar\subnamespace\foo as func;
  echo func();
  use const Foo\Bar\subnamespace\FOO;
  //echo FOO;
  登录后复制
 
  总结:
 
  ?和 Python 不一样,PHP 中的命名空间是语义上的一种概念,和具体代码的位置、布局没有关系,换句话说,使用命名空间的代码需要自己引入库文件(所有文件),至于库文件如何组织无所谓;而在 Python 中,假如模块或包中有一个 init.py 文件,则 Python 解析器会自动引入包或所有模块的文件。
 
  ?PHP 中作用域的概念很弱化,全局域和局部域分的很清楚,比如在函数或类中无法引用全局空间中的变量。而在命名空间则不同,定义命名空间的代码,假如找不到对应命名空间下的常量和函数,则会使用全局的常量和函数;而假如找不到对应名命名空间下的类(包括自定义类),则代码直接报错。
 
  ?通过 use 关键字使用命名空间的,无须通过完全限定名称的方式(\ 符号)导入,因为 PHP 已经假设导入的是完全限定的命名空间。
 
  ?通过 use 关键字可以导入常量、函数、类、接口、其他命名空间。
 
  ?命名空间是一种语言特性,为了追求更有效的使用,应该有一种使用规范和自动加载机制,这就是 PSR-4 规范。

(编辑:开发网_新乡站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!