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 相关文章推荐
一个PHP验证码类代码分享(已封装成类)
Jul 17 PHP
php查询mysql大量数据造成内存不足的解决方法
Mar 04 PHP
php微信公众平台开发类实例
Apr 01 PHP
PHP框架Laravel中实现supervisor执行异步进程的方法
Jun 07 PHP
php7安装yar扩展的方法详解
Aug 03 PHP
详解PHP版本兼容之openssl调用参数
Jul 25 PHP
PHP按一定比例压缩图片的方法
Oct 12 PHP
实例介绍PHP删除数组中的重复元素
Mar 03 PHP
laravel框架的安装与路由实例分析
Oct 11 PHP
yii2.0框架场景的简单使用示例
Jan 25 PHP
tp5框架基于ajax实现异步删除图片的方法示例
Feb 10 PHP
Yii 框架使用Forms操作详解
May 18 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
php pcntl_fork和pcntl_fork 的用法
2009/04/13 PHP
细谈php中SQL注入攻击与XSS攻击
2012/06/10 PHP
php接口和抽象类使用示例详解
2014/03/02 PHP
PHP循环遍历数组的3种方法list()、each()和while总结
2014/11/19 PHP
屏蔽PHP默认设置中的Notice警告的方法
2016/05/20 PHP
PHP创建文件及写入数据(覆盖写入,追加写入)的方法详解
2019/02/15 PHP
PHP设计模式之装饰器(装饰者)模式(Decorator)入门与应用详解
2019/12/13 PHP
解决checkbox的attr(checked)一直为undefined问题
2014/06/16 Javascript
JavaScript判断手机号运营商是移动、联通、电信还是其他(代码简单)
2015/09/25 Javascript
jQuery判断checkbox选中状态
2016/05/12 Javascript
JS脚本实现动态给标签控件添加事件的方法
2016/06/02 Javascript
AngularJS入门教程之双向绑定详解
2016/08/18 Javascript
利用python分析access日志的方法
2016/10/26 Javascript
LayUi数据表格自定义赋值方式
2019/10/26 Javascript
vue点击标签切换选中及互相排斥操作
2020/07/17 Javascript
浅谈使用nodejs搭建web服务器的过程
2020/07/20 NodeJs
在 Django/Flask 开发服务器上使用 HTTPS
2014/07/03 Python
用Python操作字符串之rindex()方法的使用
2015/05/19 Python
Python socket网络编程TCP/IP服务器与客户端通信
2017/01/05 Python
你眼中的Python大牛 应该都有这份书单
2017/10/31 Python
python使用MQTT给硬件传输图片的实现方法
2019/05/05 Python
20行python代码实现人脸识别
2019/05/05 Python
Django实现auth模块下的登录注册与注销功能
2019/10/10 Python
python 使用递归的方式实现语义图片分割功能
2020/07/16 Python
一文带你了解Python 四种常见基础爬虫方法介绍
2020/12/04 Python
世界上最大的家庭自动化公司:Smarthome
2017/12/20 全球购物
应届毕业生个人自我评价
2013/09/20 职场文书
美容师的职业规划书
2013/12/27 职场文书
运动会四百米广播稿
2014/01/19 职场文书
教职工代表大会主持词
2014/04/01 职场文书
学校百日安全生产活动总结
2014/07/05 职场文书
商业企业管理专业求职信
2014/07/10 职场文书
银行职员工作失误检讨书
2014/10/14 职场文书
2015年小学教导处工作总结
2015/05/26 职场文书
css height属性中的calc方法详解
2021/06/03 HTML / CSS
Python pygame实现中国象棋单机版源码
2021/06/20 Python