文档章节

PHP自动加载实用技巧

大止刀口
 大止刀口
发布于 2016/04/12 08:26
字数 721
阅读 31
收藏 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
6个简单实用的Linux命令,必收藏!

6个实用的linux命令技巧 我们在使用linux的时候,经常切换到不同的目录,都是一些Linux常用命令,这里我们讲的是Linux不常用的但很实用命令的linux命令技巧,我们需要在 Bash 中重复执行先前的...

苍狼牧
2017/03/27
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
2.1K
0
Laravel 应用性能调优

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

一片枫叶ing
2017/10/27
0
0
一言不合就学习:PHP优秀学习文章资料汇总整理

发现一个不错的网站,DevStore,移动互联网企业运营解决方案整合平台,产品前期-设计阶段-开发测试-推广阶段-运维运营,各个阶段都有涉及。 下面整理一些针对包括程序员、运营、设计师等在内...

FrancisSoung
2016/08/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java springcloud B2B2C o2o多用户商城 springcloud架构-docker-feign配置(五)

简介 上一节我们讨论了怎么用feign声明式调用cloud的生产者,这节我们讨论一下feign配置,通过编写配置类,我们可以自定义feign的日志级别,日志扫描目录,可以通过feign调用服务在eureka上的...

sccspuercode
23分钟前
2
0
长连接的心跳及重连设计

前言 说道“心跳”这个词大家都不陌生,当然不是指男女之间的心跳,而是和长连接相关的。 顾名思义就是证明是否还活着的依据。 什么场景下需要心跳呢? 目前我们接触到的大多是一些基于长连接...

crossoverJie
24分钟前
3
0
OSChina 周三乱弹 —— 风扇写着先生请自爱

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @蚂蚁哈哈哈 :分享陈奕迅的单曲《落花流水》 《落花流水》- 陈奕迅 手机党少年们想听歌,请使劲儿戳(这里) @车谷 :我发现每天上班都好困 ...

小小编辑
今天
803
13
centos7重置密码、单用户模式、救援模式、ls命令、chmod命令

在工作当中如果我们错误的配置了文件使服务器不能正常启动或者忘记密码不能登录系统,如何解决这些问题呢?重装系统是可以实现的,但是往往不能轻易重装系统的,下面用忘记密码作为例子讲解如...

李超小牛子
今天
4
0
Python如何开发桌面应用程序?Python基础教程,第十三讲,图形界面

当使用桌面应用程序的时候,有没有那么一瞬间,想学习一下桌面应用程序开发?行业内专业的桌面应用程序开发一般是C++,C#来做,Java开发的也有,但是比较少。本节课会介绍Python的GUI(图形用...

程序员补给栈
今天
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部