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

【基础】PHP为什么要使用命名空间

发布时间:2023-01-05 12:34:25 所属栏目:PHP教程 来源:
导读:  基础教程力荐

  码农必须拥有一本属于自己的教科书,当你基础忘记了,也可以直接拿起来阅读,巩固基础

  概要:

  1. 声明了命名空间之后,下面的const, function, class都会划归到该命名空间
  基础教程力荐
 
  码农必须拥有一本属于自己的教科书,当你基础忘记了,也可以直接拿起来阅读,巩固基础
 
  概要:
 
  1. 声明了命名空间之后,下面的const, function, class都会划归到该命名空间。
 
  2. 只有声明过命名空间的PHP 文件才能加载有命名空间的PHP文件。
 
  3. PHP 5.3 及以上才能使用命名空间
 
  名词:
 
  关键字:namespace 用来声明 本PHP文件的命名空间
 
  常量:__NAMESPACE__ 用来返回当前命名空间的名称 默认为空字符串
 
  操作符: use 默认以最后一个\后的字符串为别名,配合 as 则为 as后的字符串,与MySQL的字段别名一致。
 
  为什么使用命名空间
 
  我们的代码可能和其他开发者的代码使用相同的类名、接口名、函数或常量名,如果不使用命名空间,名称会起冲突PHP命名空间,导致PHP执行出错。而使用命名空间将代码放到唯一的厂商命名空间,我们的代码就可以和其他开发者使用相同的类名、接口名、函数或常量名。
 
  当然如果你开发的是小型个人项目,只有少量的依赖,类名冲突可能不是问题,但是如果在团队中工作,开发用到许多第三方依赖的大型项目,就要认真对待命名冲突问题,因为你无法控制项目依赖在全局命名空间中引入的类、接口、函数和常量,这也是为什么要使用命名空间的原因。
 
  实际操作如下:
 
  在apache目录下建立如下文件:index.php,Order.php,User.php
 
  Order.php 的内容为
  /**
  ?*?@Author:?Martin
  ?*?@Support:?Martin
  ?*?@Last?Modified?by:???Martin
  ?*/
  namespace?Order;
 
  const?STR?=?'order?list';
 
  function?detail()
  {
  ????return?'order?detail';
  }
  function?call_by_self()
  {
  ????return?'call?by?self';
  }
  /**
  ?*
  ?*/
  class?Orderlist
  {
 
  ????public?function?__construct()
  ????{
  ????????echo?'Class?NameSpace?is?"',?__NAMESPACE__,?'"';
  ????}
  ????public?function?show_list()
  ????{
  ????????for?($i?=?0;?$i?5;?$i++)?{
  ????????????echo?"
  this?is?order$i";
  ????????????//内部直接访问
  ????????????echo?detail();
  ????????????echo?"
  ";
  ????????}
  ????}
  }
  //内部通过命名空间访问
  echo?\Order\call_by_self();
  index.php 内容为:
 
  /**
  ?*?@Author:?Martin
  ?*?@Support:?Martin
  ?*?@Last?Modified?by:???Martin
  ?*/
  namespace?index;
  include_once('Order.php');
 
  //外部访问class?实例化即可使用
  use?Order\Orderlist;
  $orderlist?=?new?orderlist;
  $orderlist->show_list();
 
  //外部访问静态变量和function?直接访问
  use?Order;
  echo?Order\STR;
  echo?Order\detail();
  打印结果为:

  以上内容包含了:通过命名空间来访问文件和直接实例化访问,以及本空间直接访问。
 
  命名空间的存在是为了防止两个同名的class都被载入,使用命名空间在加载第三方的类时能避免同名冲突。
 
  下面来说一下自动加载
 
  SPL 的全称是:Standard PHP Library PHP标准库,在PHP5以后已经内置在PHP中,无需另外安装。
 
  SPL包含了一套针对数据结构、迭代器、异常、文件处理等的函数库。
 
  自动装载库有以下函数
 
  spl_autoload_call:尝试调用所有已注册的__autoload()函数来装载请求类
 
  User.php 内容为:
 
  namespace?User;
  //直接载入Order
  #include('Order.php');
  //自动载入
  spl_autoload_register(function($className)?{
  ????var_dump($className);
  });
  spl_autoload_call('Order');
  打印结果为:
 
  SPL自动载入函数包含如下:
 
  spl_autoload_extensions: 注册并返回spl_autoload函数使用的默认文件扩展名。
 
  get_include_path: 设置默认引用的文件夹
 
  spl_autoload_register: 自动引入文件
 
  实际操作如下:
 
  我们重新调整目录结构和并复制order 到 lib下面 如下:
 
  修改User.php 如下:
 
  namespace?User;
 
  //直接载入Order
  #include('Order.php');
  //自动载入
  define('LIB_DIR',?__DIR__?.?DIRECTORY_SEPARATOR?.?'lib'?.?DIRECTORY_SEPARATOR);
  spl_autoload_register(function?($class)?{
  ????$path?=?LIB_DIR?.?$class?.?'.lib.php';
  ????include?($path);
  });
 
  spl_autoload_call('Order');
  use?Order;
 
  $orderList?=?new?\Order\Orderlist();
  $orderList->show_list();
  打印结果为:
 
  注意:
 
  当采用SPL载入文件时,use并不能触发spl_autoload_register函数,他会被new触发,这样就会提示找不到文件,
 
  所有采用spl_autoload_call 来提前触发自动载入。
 

(编辑:百客网 - 百科网)

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