__autolaod
转载自:https://blog.csdn.net/baidu_30000217/article/details/52743139
php实现类文件自动载入有两种办法:
- 魔术方法:__autoload();
- SPL标准库提供的spl_autoload_register();
一、__autoload()
__autoload()是php中的一个魔术方法,在代码中当调用不存在的类时会自动调用该方法。
假如现在有以下两个类文件:
//Test1.php文件
<?php
class Test1{
static function test(){
echo "test1";
}
}
//Test2.php文件
<?php
class Test2{
static function test(){
echo "test2";
}
}
现在Test.php文件中要用到 Test1.php 和 Test2.php 中的类:
//Test.php文件
<?php
include "Test1.php";
include "Test2.php";
Test1::test();
Test2::test();
用 include 或require 的问题是当我要调用的类很多的时候,include 或 require也会很多,造成代码的冗杂,而且每次执行到 Test.php 文件的时候都要加载这么多文件,有些文件还不一定用到,那就浪费了很多内存,降低效率。再者是当你某个类文件被删掉了,你还得去修改 Test.php 文件。
由于这些原因,我们用 __autoload() 去代替 include
//Test.php文件
<?php
function __autoload($class){
if(file_exists($class.".php")){
require_once($class.".php");
}else{
die("文件不存在!");
}
}
Test1::test();
Test2::test();
__autoload() 魔术方法的作用是当你调用不存在的类时会被自动调用,在 Test.php文件中我们调用 类Test1 和 类Test2,由于我们没有显式的引用类文件,那么系统就会自动调用 __autoload() 方法。
但是,到现在为止 __autoload() 方法基本上被废弃了!为啥呢?因为:
1、最大的缺陷就是一个文件中不允许有多个 __autoload()方法,想象一下,你的项目引用了别人的一个项目,你的项目中有一个 __autoload,别人的项目也有一个__autoload,这样两个__autoload就冲突了。解决的办法就是修改__autoload成为一个,这无疑是非常繁琐的。
2、假如你的项目中的类根据不同的用处放在不同的文件夹中 classes 和 core,然后Test.php文件中要分别调用里面对应的类,怎么搞?这样?
function __autoload($class){
if(file_exists("classes/".$class.".php")){
require_once("classes/".$class.".php");
}else{
die("文件不存在!");
}
}
function __autoload($class){
if(file_exists("core/".$class.".php")){
require_once("core/".$class.".php");
}else{
die("文件不存在!");
}
}
Test1::test();
Test2::test();
这样做的话会出现致命错误,因为 __autoload()重复定义!(其实第1点的原因也是一样)
为了解决这个问题,于是就有 spl_autoload_register()
二、spl_autoload_register()
好,到了这一步,我们先不说 spl_autoload_register(),既然不用__autoload(),那么我们就自己定义负责类加载的函数:
function my_autoload1($class){
if(file_exists("classes/".$class.".php")){
require_once("classes/".$class.".php");
}else{
die("文件不存在!");
}
}
function my_autoload2($class){
if(file_exists("core/".$class.".php")){
require_once("core/".$class.".php");
}else{
die("文件不存在!");
}
}
//现在我们就可以加载类文件啦
my_autoload1("Test1");
my_autoload2("Test2");
Test1::test();
Test2::test();
但是如上代码所示,直接调用我们的自定义类文件加载函数跟 include 有啥区别吗?这时 spl_autoload_register 就派上用场了。
显然,创造一个负责类文件加载函数不是为了让我们直接调用它,而是让PHP在需要类定义的时候为我们调用它。我们称这种功能为“自动加载”。
要开启“自动加载”功能,需要将加载函数注册到PHP中:
spl_autoload_register("my_autoload1");
我们重新实现 Test.php:
//Test.php文件
function my_autoload1($class){
if(file_exists("classes/".$class.".php")){
require_once("classes/".$class.".php");
}else{
die("文件不存在!");
}
}
function my_autoload2($class){
if(file_exists("core/".$class.".php")){
require_once("core/".$class.".php");
}else{
die("文件不存在!");
}
}
//将加载函数注册到PHP中
spl_autoload_register("my_autoload1");
spl_autoload_register("my_autoload2");
Test1::test();
Test2::test();
这样就是实现了PHP的类文件自动载入功能。
__autolaod的更多相关文章
- 现代php编程
自动加载__autolaod和spl_autoload_register() 自动加载就是指如果找不到某个类如何处理的方式,具体可参见此文,可以说spl_autoload_register是更加高级, ...
随机推荐
- 性能测试工具 Web Service 性能测试工具比较
[转自]https://testerhome.com/topics/3003 背景 希望选择一款Web Service性能测试工具,能真实模拟大量用户访问网站时的请求,从而获取服务器当前的请求处理能力 ...
- mac中 hosts地址
/etc/hosts 拉出hosts文件,修改之后再拉进去
- python-django rest framework框架之分页
1. 以前django做的分页组件当数据量特别大的时候,性能不是很高,有以下三种方式处理: a. 记录当前访问页的最后一条数据id,往后取多少条 b. 最多显示120页 ...
- upsource初探
在JetBrains 的官网上,看到codereview的工具 upsource ,https://www.jetbrains.com/upsource/ 官方的英文文档 来看下博客园上有博主简单的 ...
- 一道PHP题引出的“短路求值”
今天群里有个人问了一个问题,代码如下: $a = 3; $b = 2; if ($a = 2 || $b = 5) { ++$a; } echo $a; 说代码段的执行的结果为1,问大家$a的 ...
- springMVC Model ModelMap 和 ModelAndView的区别(转)
原文地址:springMVC Model ModelMap 和 ModelAndView的区别 近来在看代码,发现controller里有不同的处理返回数据的方式,而自己一直在用ModelAndVie ...
- PReLU
PReLU全名Parametric Rectified Linear Unit. PReLU-nets在ImageNet 2012分类数据集top-5上取得了4.94%的错误率,首次超越了人工分类的错 ...
- GitHub 简单用法
1. GitHub账号的申请 首先打开Github主页,https://github.com 如果你没有登录过的话会打开如下图的界面(登录过你就不用看这段了), 注册画面如下: 注意右侧不是登陆界面而 ...
- maven聚合工程tomcat插件启动没有 Starting ProtocolHandler ["http-bio-8081"]
Starting ProtocolHandler ["http-bio-8081"]无法显示,一般有三个原因: (1)数据库连不上: (2)注册中心连不上(我这里用的是zookee ...
- 放弃Dubbo,选择最流行的Spring Cloud微服务架构实践与经验总结
http://developer.51cto.com/art/201710/554633.htm Spring Cloud 在国内中小型公司能用起来吗?从 2016 年初一直到现在,我们在这条路上已经 ...