[PHP] 项目实践中的自动加载实现
1.使用spl_autoload_register函数注册一个自己定义的自动加载函数
2.当在代码中new一个不存在的类的时候,上面的函数会被调用,不存在的类名会被作为参数传入该函数中
3.兼容了两种方式,命名空间对应目录的方式 \app\test,类名下划线分割对应目录的方式app_test,都是对应的app目录下的test.php文件,类名要和文件名一致
4.set_include_path(),可以有多个用冒号:隔开,动态设置php.ini中的include_path 配置选项
<?php
class Application {
private static $instance = null;
private $libPath = './';
private $phpExt = '.php';
public function setLibPath($path, $autoload = false) {
$this->libPath = trim(trim($path), DIRECTORY_SEPARATOR);
set_include_path($this->getLibPath());
if ($autoload) {
spl_autoload_register(array('Application', 'load'));
}
return $this;
}
public static function instance() {
if (!self::$instance) {
self::$instance = new self();
}
return self::$instance;
}
//获取文件后缀
public function getPhpExt() {
return $this->phpExt;
}
//设置文件后缀
public function setPhpExt($ext) {
$this->phpExt = $ext;
return $this;
}
//设置根路径
public function setPath($path) {
$this->path = rtrim(trim($path), DIRECTORY_SEPARATOR);
return $this;
}
//设置自动加载的路径
public function getLibPath() {
return $this->path . DIRECTORY_SEPARATOR . $this->libPath;
}
//自动加载函数
public static function load($class) {
$pos = strrpos($class, '\\');
if ($pos !== false) {
$ns = str_replace('\\', DIRECTORY_SEPARATOR, substr($class, 0, $pos + 1));
$className = substr($class, $pos + 1);
} else {
$ns = DIRECTORY_SEPARATOR;
$className = $class;
}
if (strpos($className, '_') !== false) {
$className = str_replace('_', DIRECTORY_SEPARATOR, $className);
}
$ins = self::instance();
$classFile = $ins->getLibPath() . $ns . $className . $ins->getPhpExt();
if (!(include $classFile)) {
throw new Exception('load class failed: class=' . $class . ' file=' . $classFile);
}
}
}
Application::instance()->setPath(dirname(__FILE__))->setLibPath(DIRECTORY_SEPARATOR, true);
//测试,在根目录创建app目录,下面创建这两个文件
new app_user();
new \app\admin();
app目录下面的user.php
<?php
class app_user{
public function __construct(){
new \app\admin();
}
}
app目录下的admin.php
<?php
namespace app;
class admin{}
[PHP] 项目实践中的自动加载实现的更多相关文章
- PHP中的自动加载
自动加载? 或许你已经对自动加载有所了解.简单描述一下:自动加载就是我们在new一个class的时候,不需要手动去写require来导入这个class.php文件,程序自动帮我们加载导入进来.这是 ...
- 关于thinkPHP中的自动加载和手动导入
首先先讲自动加载: 前提:你的第三方类库要满足(1)符合命名规范和后缀的类库(2)使用命名空间,命名空间和路径一致的类库 (1)在ThinkPHP目录下的library目录下的每一个子目录都是一个根命 ...
- autocad2008+C#2008开发中设置自动加载dll
一.复制编译后的dlll路径,比如我的是D:\zjy\cad开发\学习\宗地图\bin\Debug\zd.dll 二.随便找个地方新建一个记事本,在记事本中写入以下内容: (command " ...
- ZendFramework中实现自动加载models
最近自学Zendframework中,写Controller的时候总要require model下的类文件,然后才能实例化,感觉非常不爽 Google了许久,找到个明白人写的方法不错,主要就是修改ap ...
- 在Thinkphp中【自动加载自定义扩展配置文件】!
/Conf/config.php为正式的扩展文件 /Conf/verify.php为扩展的自定义配置文件 /Conf/sendmail.php为扩展的自定义配置文件 如果要自动加载 verify和se ...
- 访问项目时,不能自动加载index.php文件
1.修改配置文件D:\lamp\apache\conf\httpd.conf加上DirectoryIndex index.hmtl index.php <IfModule !mpm_netwar ...
- PHP 命名空间以及自动加载(自动调用的函数,来include文件)
这篇文章的目的是记录 1. php中的自动加载函数 __autoload(), 和 spl_autoload_register()函数, 2 .php中命名空间的使用. 一.当不使用命名空间的时候 a ...
- Composer 自动加载(autoload)机制
自动加载的类型 总体来说 composer 提供了几种自动加载类型 classmap psr-0 psr-4 files 这几种自动加载都会用到,理论上来说,项目代码用 psr-4 自动加载, hel ...
- php怎么自动加载
在 PHP 代码的顶部你是不是经常看到这样的代码. require 'lionis.php'; require 'is.php'; require 'cool.php'; 如果只是引入几个 PHP 脚 ...
随机推荐
- requests---发送post请求完成登录
前段时间写过一个通过cookies完成登录,今天我们写一篇通过post发送请求完成登录豆瓣网 模拟登录 1.首先找到豆瓣网的登录接口 打开豆瓣网站的登录接口,请求错误的账号密码,通过F12或者抓包工具 ...
- jQuery中的筛选(六)
1. eq(index|-index) 获取当前链式操作中第N个jQuery对象,返回jQuery对象,当参数大于等于0时为正向选取,比如0代表第一个,1代表第二个.当参数为负数时为反向选取,比如-1 ...
- luoguP3292 [SCOI2016]幸运数字(倍增做法)
题意 线性基套上树上倍增即可,注意边界. code: #include<bits/stdc++.h> using namespace std; typedef long long ll; ...
- Eureka服务注册中心错误:com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect
报错信息 14:43:45.484 [main] INFO com.netflix.discovery.DiscoveryClient - Getting all instance registry ...
- LeetCode 394:字符串解码 Decode String
题目: 给定一个经过编码的字符串,返回它解码后的字符串. Given an encoded string, return its decoded string. 编码规则为: k[encoded_st ...
- sql server 下载安装标记
SQL Server 2017 的各版本和支持的功能 https://docs.microsoft.com/zh-cn/sql/sql-server/editions-and-components-o ...
- IO多路复用(转)
原文:Python之路,Day9 , IO多路复用(番外篇) 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文 ...
- Window权限维持(四):快捷方式修改
Windows快捷方式包含对系统上安装的软件或文件位置(网络或本地)的引用.自从恶意软件出现之初,便已将快捷方式用作执行恶意代码以实现持久性的一种方法.快捷方式的文件扩展名是.LNK,它为红队提供了很 ...
- ASP.NET Core快速入门(第1章:介绍与引入)--学习笔记
课程链接:http://video.jessetalk.cn/course/explore 良心课程,大家一起来学习哈! 任务1:课程介绍 1.介绍与引入 2.配置管理 3.依赖注入 4.ASP.NE ...
- aspx.designer.cs没有自动生成代码(没有自动注册)
遇到这个问题的最大可能是:aspx页面存在bug. 比如说我的主页是从项目里的别的页面复制过来的,但是少复制了一些引用,页面就存在bug,导致aspx.designer.cs没有自动生成代码. 解决方 ...