文档章节

PHP自动加载实用技巧

大止刀口
 大止刀口
发布于 2016/04/12 08:26
字数 721
阅读 29
收藏 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
汕头
程序员
分享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
前端开发攻城师不可忽视的五个HTML5新特性

HTML5已经火了一段时间了,相信作为web相关开发工程师,肯定或多或少的了解和尝试过一些HTML5的特性和编程。还记得以前我们介绍过的HTML5新标签。 作为未来前端开发技术的潮流和风向标,HTM...

gbin1
2013/07/03
6.1K
17
web人力资源信息系统开发日志④

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

人可工作室
2017/07/09
0
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

没有更多内容

加载失败,请刷新页面

加载更多

javascript source map 的使用

之前发现VS.NET会为压缩的js文添加一个与文件名同名的.map文件,一直没有搞懂他是用来做什么的,直接删除掉运行时浏览器又会报错,后来google了一直才真正搞懂了这个小小的map文件背后的巨大...

粒子数反转
昨天
0
0
谈谈如何学Linux和它在如今社会的影响

昨天,还在农耕脑力社会,今天已经人工智能技术、大数据、信息技术的科技社会了,高速开展并迅速浸透到当今科技社会的各个方面,Linux日益成为人们信息时代的到来,更加考验我们对信息的处理程...

linux-tao
昨天
0
0
学习设计模式——中介者模式

1. 认识中介者模式 1. 定义:用一个中介对象来封装一系列的对象交互行为,中介者使得各对象不需要显式的互相引用,从而使其松散耦合,独立的改变他们之间的交互。 2. 结构: Mediator:中介者...

江左煤郎
昨天
0
0
深入理解Plasma(1):Plasma 框架

这一系列文章将围绕以太坊的二层扩容框架,介绍其基本运行原理,具体操作细节,安全性讨论以及未来研究方向等。本篇文章作为开篇,主要目的是理解 Plasma 框架。 Plasma 作为以太坊的二层扩容...

HiBlock
昨天
0
0
Java 8 日期 示例

Java 8 推出了全新的日期时间API。Java处理日期、日历和时间的方式一直为社区所诟病,将 java.util.Date设定为可变类型,以及SimpleDateFormat的非线程安全使其应用非常受限。Java也意识到需...

阿刚ABC
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部