PHP命名空间与自动加载类详解


Posted in PHP onSeptember 04, 2018

本文实例讲述了PHP命名空间与自动加载类。分享给大家供大家参考,具体如下:

今天我要给大家介绍的是PHP的命名空间 和 自动加载类

我先简单的分开演示 在放在一起

大家请看:

什么是自动加载类?

想必大家都应该知道__autoload 这个魔术方法

$db = new DB();
function __autoload($className)
{
echo $className;
exit();
//在这个里面引用类
}

在运用这个类只能加载一次 ,在很多时候我们要引入的不止一个类这个时候怎么办呢!

牛逼的php大神们  出了个新方法 来解决 这个问题  请看就是这个函数

spl_autoload_register() 满足了此类需求。 它实际上创建了 autoload 函数的队列,按定义时的顺序逐个执行。相比之下, __autoload() 只可以定义一次。

这个函数的用法有很多  这里先给大家介绍一种使用方法

如下:

function load1($className)
{
echo 1;
require $className . '.php';
}
spl_autoload_register('load1'); //将load1函数注册到自动加载队列中。
$db = new DB(); //找不到DB类,就会自动去调用刚注册的load1函数了
//php 5.3之后,也可以像这样支持匿名函数了。
spl_autoload_register(function($className){
if (is_file('./lib/' . $className . '.php')) {
require './lib/' . $className . '.php';
}
});

多个spl_autoload_register的使用

判断是否有此文件

如果有引入 如果没有 没有如果了,哪来的如果

function load1($className)
{
  echo 1;
  if (is_file($className . '.php')) {
    require $className . '.php';
  }
}
function load2($className)
{
  echo 2;
  if (is_file('./app/' . $className . '.php')) {
    require './app/' . $className . '.php';
  }
}
function __autoload($className)
{
  echo 3;
  if (is_file('./lib/' . $className . '.php')) {
    require './lib/' . $className . '.php';
  }
}
//注册了3个
spl_autoload_register('load1');
spl_autoload_register('load2');
spl_autoload_register('__autoload');
$db = new DB(); //DB就在本目录下
$info = new Info(); //Info 在/lib/Info.php

我们可以打印spl_autoload_functions()函数,来显示一共注册了多少个自动加载:

var_dump(spl_autoload_functions());
//数组的形式输出
array (size=3)
0 => string 'load1' (length=5)
1 => string 'load2' (length=5)
2 => string '__autoload' (length=10)

命名空间

一个php文件里 是不支持 new 两个名字的

这个时候我们就能用的到命名空间了

namespace app;
class new{
public function ten()
{
echo "85";
}
}
namespace hii;
class new{
public function ten()
{
echo "85";
}
}

spl_autoload_register自动加载+namespace命名空间 的使用

废话不多数  看例子

AutoLoading\loading

<?php
namespace AutoLoading;
class loading {
public static function autoload($className)
{
    //把 \ 转换层 / , 便于兼容Linux文件找。Windows 下是通用的
    //由于namspace 很规格,所以直接很快就能找到
    $fileName = str_replace('\\', '/', DIR . '\\'. $className) . '.php';
    if (is_file($fileName)) {
    require $fileName;
    } else {
    echo $fileName . ' is not exist'; die;
    }
  }
}

上面就是一个自动加载的核心思想方法。下面我们就来spl_autoload_register来注册这个函数:

index.php

<?php
//定义当前的目录绝对路径
define('DIR', dirname(__FILE__));
//加载这个文件
require DIR . '/loading.php';
//采用`命名空间`的方式注册。php 5.3 加入的
//也必须是得是static静态方法调用,然后就像加载namespace的方式调用,注意:不能使用use
spl_autoload_register("\\AutoLoading\\loading::autoload");
// 调用三个namespace类
//定位到Lib目录下的Name.php
Lib\Name::test();
//定位到App目录下Android目录下的Name.php
App\Android\Name::test();
//定位到App目录下Ios目录下的Name.php
App\Ios\Name::test();

由于我们是采用PSR-O方式来定义namespace的命名的,所以很好的定位到这个文件的在哪个目录下了。很爽。对不对。

APP\Android\Name

namespace App\Android;
class Name
{
public function __construct()
{
echo __NAMESPACE__ . "<br>";
}
public static function test()
{
echo __NAMESPACE__ . ' static function test <br>';
}
}

所以就会很容易找到文件,并输出:

Lib static function test
App\Android static function test
App\Ios static function test

好了。基本的东西就讲完了.

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
一个更简单的无限级分类菜单代码
Jan 16 PHP
php中curl、fsocket、file_get_content三个函数的使用比较
May 09 PHP
PHP实现显示照片exif信息的方法
Jul 11 PHP
ThinkPHP控制器里javascript代码不能执行的解决方法
Nov 22 PHP
如何解决PHP无法实现多线程的问题
Sep 25 PHP
Zend Framework基本页面布局分析
Mar 19 PHP
PHP 绘制网站登录首页图片验证码
Apr 12 PHP
CI框架整合smarty步骤详解
May 19 PHP
浅谈PHP中静态方法和非静态方法的相互调用
Oct 04 PHP
Thinkphp5.0自动生成模块及目录的方法详解
Apr 17 PHP
PHP排序算法之直接插入排序(Straight Insertion Sort)实例分析
Apr 20 PHP
Laravel框架控制器,视图及模型操作图文详解
Dec 04 PHP
ThinkPHP框架实现定时执行任务的两种方法分析
Sep 04 #PHP
php 后端实现JWT认证方法示例
Sep 04 #PHP
PHP利用Mysql锁解决高并发的方法
Sep 04 #PHP
TP5(thinkPHP5)框架基于ajax与后台数据交互操作简单示例
Sep 03 #PHP
PHP实现的AES双向加密解密功能示例【128位】
Sep 03 #PHP
PHP实现的日历功能示例
Sep 01 #PHP
thinkPHP5框架分页样式类完整示例
Sep 01 #PHP
You might like
用Zend Encode编写开发PHP程序
2006/10/09 PHP
解决MySQL中文输出变成问号的问题
2008/06/05 PHP
Zend Studio去除编辑器的语法警告设置方法
2012/10/24 PHP
基于PHP编程注意事项的小结
2013/04/27 PHP
PHP变量内存分配问题记录整理
2013/11/27 PHP
PHP登陆后跳转到登陆前页面实现思路及代码
2014/01/17 PHP
PHP中使用sleep函数实现定时任务实例分享
2014/08/21 PHP
PHP MPDF中文乱码的解决方式
2015/12/08 PHP
PHP实现限制IP访问及提交次数的方法详解
2017/07/17 PHP
JavaScript 异步调用框架 (Part 5 - 链式实现)
2009/08/04 Javascript
ExtJs使用总结(非常详细)
2012/03/22 Javascript
多个datatable共存造成多个表格的checkbox都被选中
2013/07/11 Javascript
JavaScript中检测变量是否存在遇到的一些问题
2013/11/11 Javascript
JavaScript制作简单分页插件
2016/09/11 Javascript
微信公众号支付H5调用支付解析
2016/11/04 Javascript
Bootstrap基本组件学习笔记之分页(12)
2016/12/08 Javascript
validationEngine 表单验证插件使用实例代码
2017/06/15 Javascript
React-Native左右联动List的示例代码
2017/09/21 Javascript
video.js 实现视频只能后退不能快进的思路详解
2018/08/09 Javascript
详解如何制作并发布一个vue的组件的npm包
2018/11/10 Javascript
React路由鉴权的实现方法
2019/09/05 Javascript
nodemon实现Typescript项目热更新的示例代码
2019/11/19 Javascript
Python实现JSON反序列化类对象的示例
2018/01/31 Python
Python字符串、整数、和浮点型数相互转换实例
2018/08/04 Python
想学python 这5本书籍你必看!
2018/12/11 Python
django 多数据库及分库实现方式
2020/04/01 Python
Python编写万花尺图案实例
2021/01/03 Python
给儿子的表扬信
2014/01/15 职场文书
原材料检验岗位职责
2014/03/15 职场文书
学习方法演讲稿
2014/05/10 职场文书
护士优质服务演讲稿
2014/08/26 职场文书
基层干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
2014年机关党建工作总结
2014/11/11 职场文书
个人承诺书格式范文
2015/04/29 职场文书
个人工作违纪检讨书
2015/05/05 职场文书
Promise面试题详解之控制并发
2021/05/14 面试题