文档章节

PHP自动加载实用技巧

大止刀口
 大止刀口
发布于 2016/04/12 08:26
字数 721
阅读 28
收藏 0
点赞 1
评论 0

0.为什么需要单入口?

原因很简单,需要确保自动加载类的函数注册成功。单入口确保这点的一种简单实现。设置好重写URL;一个入口PHP文件(常见的是各大框架的index.php);自动加载使用spl_autoload_register配合PHP闭包。一个简单的实现如下代码:

spl_auto_register(function($universal){
    $separator = strrpos($universal,'\\');//获取命名空间和类名的分隔符位置
    $globle = $separator === FALSE;//类是否在全局命名空间
    $name = $globle ? $universal : substr($universal,$separator);//获取类名
    $space = $globle ? '' : substr($universal,0,$separator);//获取命名空间
    $path = './path/'.$class.'.class.php';//只是把类名和路径进行组合,没用到命名空间(请自定义路径映射)。
    if(is_file($path)require $path;
});

以上这种函数的注册要早于对类的引用(单入口确保这点),这样在接下来的代码中直接使用类。

1.配合静态函数实现模块化

加入我在'./path/'目录下定义了这样的类(类文件的路径为:'./path/Demo.class.php'):

namespace Space;
abstract class Demo{
    static function method(){
        echo "I'm demo";
    }
}

在其他文件中使用Demo类的method静态函数就可以直接使用:

Space\Demo::method();

这样把不同的函数归类到不同的类中,就可以实现函数的自动加载。

2.自动加载可以避免重复加载

PHP比较简单的避免重复加载是使用require_once,但是如果把函数模块化到类中,再利用自动记载可以避免重复加载。

比如我们有这么一个用于配置数据库的文件(路劲:'./configuration/database.php'):

$db_type = 'mysql';
$db_name = 'demodb';
$db_host = 'localhost';
$db_port = '3306';
$db_user = 'demouser';
$db_pass = 'demopass';

这样的配置看似引入了多个全局变量,其实不然。以下我们实现一个通过以上数据库参数new一个PDO的例子(路径:'./path/Database.class.php'):

namespace Space;

abstract class Database{
    private static $dsn;
    private static $username;
    private static $password;
    
    static function newPDO(){
        return new PDO(self::$dsn,self::$username,self::$password);
    }
    
    static function initialize(){
        require './configuration/database.php';
        self::$dsn = $db_type.':dbname='.$db_name.
            ';host='.$db_host.';port='.$db_port;
        self::$username = $db_user;
        self::$password = $db_pass;
    }
}
Database::initialize();

这样要在别处不仅不需要引入'./configuration/database.php',而且要生成一个PDO只需:

$pdo = Space\Database::newPDO();

以上过程没有引入一个全局变量,因为'./configuration/database.php'只在Database的initialize作用域里引入。

同时也解决的静态类成员初始化位置的问题(在加载类时初始化)。

总结

以上过程加载一般的类(不限只有静态方法的类),单入口其实并非必须(确保的加载函数的注册就够了),但是单入口却是实现最简单和常见的方法。函数的自动加载借助静态方法也实现了,同时还把函数模块化(放在不同的类里),静态成员初始化也一并解决。

© 著作权归作者所有

共有 人打赏支持
大止刀口
粉丝 6
博文 17
码字总数 10107
作品 0
汕头
程序员
web人力资源信息系统开发日志④

第四阶段(2017年6月21—7月6日):进入测试冲刺阶段,bug大扫荡,总结分析并准备上线交付使用。软件的生命周期就是不断更新升级,一旦停止更新,软件生命就会衰老枯竭。接下来的工作是调试上...

人可工作室
2017/07/09
0
0
分享40个实用的jQuery用户界面UI设计技巧及教程

作者:Jane Bernardo 翻译:Terry li - GBin1.com 原文: 40 Useful jQuery Techniques And Tutorials For Great User Interface jQuery在web开发中已经吸引了大量开发人员。使用jQuery能构建......

gbin1
2011/07/19
2K
0
PHP中的自动加载

what is ? 或许你已经对自动加载有所了解。简单描述一下:就是我们在new一个class的时候,不需要手动去写require来导入这个class.php文件,程序自动帮我们加载导入进来。这是php5.1.2(好像是...

sd19871122
2017/12/02
0
0
Laravel 应用性能调优

1). 调优 Laravel 中的一下调优和测试方式 2). 方式 这次性能测试方案中用到的优化技巧主要基于 Laravel 框架本身及其提供的工具。 关闭应用debug 缓存配置信息 缓存路由信息 类映射加载优化...

一片枫叶ing
2017/10/27
0
0
web人力资源信息系统开发日志③

第三阶段(2017年5月21—6月20日):主要开发内容重心转向用户业务管理层,业务逻辑是用PHP程序对数据库表进行调用,满足业务管理需求。数据库除了安装PDO驱动外还需要安装ODBC相应的驱动,便...

人可工作室
06/26
0
0
PHP 开发者该知道的 5 个 Composer 小技巧

PHP 开发者该知道的 5 个 Composer 小技巧 Composer 是新一代的PHP依赖管理工具。其介绍和基本用法可以看这篇《Composer PHP依赖管理的新时代》。本文介绍使用Composer的五个小技巧,希望能给...

peasant
2016/12/02
8
0
在 Mac OS X 中安装 MySQL

安装MySQL 由于Mac OS X中并没有预装MySQL,所以需要自己手动安装,我选择的是mysql-5.5.10-osx10.5-x86.dmg。 下载MySQL,选择合适的版本。 运行下载的dmg文件:首先运行mysql-5.5.10-osx1...

cnblogs
2011/03/25
1K
3
PHP 命名空间 namespace / 类别名 use / 框架自动载入 机理的

相比 PHP5.2 版本 PHP5.3 新增了三大主要新特性 命名空间 延迟静态绑定 lambda匿名函数 命名空间的出现也使PHP可以更加合理的组织项目结构,同时通过命名空间和自动载入机制一大批 PHP 的 MV...

big_cat
2016/02/02
5.4K
0
php开源框架--CorePHP

简介: CorePHP框架是一个快速,安全,灵活的php开源框架,主要是为了简化和快速开发小型项目和开源系统二次开发而诞生。它既可以完美的支持MVC模式,又可以不受限制的支持传统编程模式。它是...

shooke
2012/12/27
2.4K
1
分享10个优美的程序员把玩儿的实用科技设计酷站(5)

今天为优美的程序员们带来了科技设计酷站第5期!哈哈哈~~~绝对实用!快来看看吧~~~O(∩_∩)O~ Draggable Draggable是一个来自 Shopify 的有趣的库,它是建立在一个支持浏览器内托拽的A...

Janet_zyh
2017/12/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

mysql 主从复制中遇到的错误!

。。。。。

万建宁
13分钟前
0
0
DUBBO 详细介绍

摘要: 主要核心部件: Remoting: 网络通信框架,实现了 sync-over-async 和 request-response 消息机制. RPC: 一个远程过程调用的抽象,支持负载均衡、容灾和集群功能 Registry: 服务目录框架...

明理萝
24分钟前
0
1
4 个快速的 Python 编译器 for 2018

简评:Python 和其他的解释型语言一样经常被吐槽性能不行,所以开发人员为了提升性能创建了不少编译器,本文则选取其中的四个做了基准测试。 Python 其实是一种相当快的语言,但它并不像编译...

极光推送
27分钟前
0
0
spring boot注册多个MQ服务器的问题

关于注册到多个MQ源的文章已经有很多了,这里记录一下声明queue的坑; 如果使用注册bean的方式声明queue,会导致声明的queue同时被注册到所有的MQ源上; //如果使用下面的声明方式,que...

placeholder
28分钟前
0
0
Java面试基础篇——第九篇:BIO,NIO,AIO的区别

现在IO模型主要分三类:BIO(同步阻塞IO),NIO(同步非阻塞IO),AIO()。 先来看看BIO。 1. BIO 服务端接受到请求后,要指派或新建一个线程去处理客户端的IO请求,直到收到断开连接的指令。这么做...

developlee的潇洒人生
33分钟前
0
0
@RequestMapping @ResponseBody 和 @RequestBody 用法与区别

1.@RequestMapping 国际惯例先介绍什么是@RequestMapping,@RequestMapping 是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为...

特拉仔
35分钟前
1
0
基于 HTML5 结合互联网+ 的 3D 隧道

前言 目前,物资采购和人力成本是隧道业发展的两大瓶颈。比如依靠民间借贷,融资成本很高;采购价格不透明,没有增值税发票;还有项目管控和供应链管理的问题。成本在不断上升,利润在不断下...

xhload3d
37分钟前
0
0
济南小程序热度分析

原文链接:http://www.jnqianle.cn/company/2072.html

tianma3798
38分钟前
1
0
大数据软件

beats 采集 kafka spark hive es grafana zeppelin

ArlenXu
40分钟前
0
0
Mac item2常用快捷键

标签 新建标签:command + t 关闭标签:command + w 切换标签:command + 数字 command + 左右方向键 切换全屏:command + enter 查找:command + f 分屏 水平分屏:command + d 垂直分屏:c...

说回答
43分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部