namespace 终极用法

阅读次数: 5,728

  • A+
所属分类:PHP
今天忽然遇到一个问题,随机下载的GitHub上的代码,好多都是需要本身环境自带composer这个算是插件的东西。然而有些代码下载下来你会发现他调用的autoload.php (自动加载)这个方法或对象并不存在,这时候你需要把composer的环境安装下。然后你就需要合并下所有的 autoload_psr1 autoload_real autoload_static autoload_classmap autoload_namespaces 等这些文件。然而这些虽然不算很麻烦,但也是有些不爽的地方。有时候会出现覆盖的情况。所以这个时候我们就可以自建建立一个 autoload 的这样一个方法,还应该与memcache 或 redis 混搭使用。
婴儿期版本如下:
根目录/src/autoload.php
<?php

/**
* Created by 大师兄
* 派系: 神秘剑派
* 技能: zxc秒杀
* Date: 2017/8/12
* Time: 9:45
* QQ: 997823131
*/

spl_autoload_register(function($class){
$class_arr = explode("\\",$class);
$class_num = count($class_arr);
$class_path = ROOT_PATH.DS.VENDER;

if($class_num > 1){
//算出 需要加载的类的全路径
for($i=0;$i<$class_num;$i++){
$class_path .= DS.$class_arr[$i];
}
$class_path .= ".php";
}else{
$class_path .= $class.".php";
}
require_once($class_path);
});
?>

根目录/common.php
<?php
define(ROOT_PATH,$_SERVER['DOCUMENT_ROOT']);
define(DS,DIRECTORY_SEPARATOR);
define(VENDER,"src");  //后期可以定义为不同项目的不同自动调用方法
?>

需要注意的细节问题
注意1 在 任何地方调用时 如果 不加 use 则调用方法 为 $obj = new fileName\fileName\objName();
使用 use  fileName\fileName\objName    则调用方法为 $obj = new objNmae();
注意2 在 任何需要被调用的 类里边 根据类所在的地方是否 跟 autoload.php 在同一级别文件夹里边 在 判断是否 加 namespace 以及加多少层 namespace (重要)
注意3 在 被需要调用的类里边需要调用另一个类时也可以 按照 注意 1 里边的方法

最后你会发现 这个跟composer所实现的功能大概是一样的。

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: