文档章节

PHP AutoLoad 自动加载机制分析实践

 爱尚论坛
发布于 2015/03/20 09:05
字数 837
阅读 9
收藏 0

  PHP autoload自动加载机制可以减少不必要的文件包含,从而一定程度上提高PHP网站的运行性能。本文就简单介绍一下PHP中autoload自动加载机制的原理及使用方法。

  __autoload的使用方法1

  最经常使用的就是这种方法,根据类名,找出类文件,然后require_one

  view sourceprint?

  function __autoload($class_name) {

  $path = str_replace('_', '/', $class_name);

  require_once $path . '.php';

  }

  // 这里会自动加载Http/File/Interface.php 文件

  $a = new Http_File_Interface();

  这种方法的好处就是简单易使用。当然也有缺点,缺点就是将类名和文件路径强制做了约定,当修改文件结构的时候,就势必要修改类名。

  __autoload的使用方法2(直接映射法)

  view sourceprint?

  $map = array(

  'Http_File_Interface' => 'C:/PHP/HTTP/FILE/Interface.php'

  );

  function __autoload($class_name) {

  if (isset($map[$class_name])) {

  require_once $map[$class_name];

  }

  }

  // 这里会自动加载C:/PHP/HTTP/FILE/Interface.php 文件

  $a = new Http_File_Interface();

  这种方法的好处就是类名和文件路径只是用一个映射来维护,所以当文件结构改变的时候,不需要修改类名,只需要将映射中对应的项修改就好了。

  这种方法相较于前面的方法缺点是当文件多了的时候这个映射维护起来非常麻烦,或许这时候你就会考虑使用json或者单独一个文件来进行维护了。或许你会想到使用一个框架来维护或者建立这么一个映射。

  spl_autoload

  __autoload的最大缺陷是无法有多个autoload方法

  好了, 想下下面的这个情景,你的项目引用了别人的一个项目,你的项目中有一个__autoload,别人的项目也有一个__autoload,这样两个__autoload就冲突了。解决的办法就是修改__autoload成为一个,这无疑是非常繁琐的。

  因此我们急需使用一个autoload调用堆栈,这样spl的autoload系列函数就出现了。你可以使用spl_autoload_register注册多个自定义的autoload函数

  如果你的PHP版本大于5.1的话,你就可以使用spl_autoload

  先了解spl的几个函数:

  \

  spl_autoload 是_autoload()的默认实现,它会去include_path中寻找$class_name(。php/.inc)

  Spl_autoload实现自动加载:

  view sourceprint?

  /*http.php*/

  <?php

  class http

  {

  public function callname(){

  echo "this is http";

  }

  }

  /*test.php*/

  <?php

  set_include_path("/home/yejianfeng/handcode/"); //这里需要将路径放入include

  spl_autoload("http"); //寻找/home/yejianfeng/handcode/http.php

  $a = new http();

  $a->callname();

  Spl_autoload_register

  将函数注册到SPL __autoload函数栈中,直接看一个例子:

  view sourceprint?

  /*http.php*/

  <?php

  class http

  {

  public function callname(){

  echo "this is http";

  }

  }

  /*test.php*/

  <?php

  spl_autoload_register(function($class){

  if($class == 'http'){

  require_once("/home/yejianfeng/handcode/http.php");

  }

  });

  $a = new http();

  $a->callname();

  spl_autoload_call

  调用spl_autoload_register中注册的调用函数, 看下面的例子

  view sourceprint?

  /*http.php*/

  <?php

  class http

  {

  public function callname(){

  echo "this is http";

  }

  }

  /*http2.php*/

  <?php

  class http

  {

  public function callname(){

  echo "this is http2";

  }

  }

  /*test.php*/

  <?php

  spl_autoload_register(function($class){

  if($class == 'http'){

  require_once("/home/yejianfeng/handcode/http.php");

  }

  if($class == 'http2'){

  require_once("/home/yejianfeng/handcode/http2.php");

  }武汉仁济肿瘤医院是怎么收费的

  });

  spl_auto_call('http2');

  $a = new http();

  $a->callname(); //这个时候会输出"this is http2"

  spl_auto_register这个函数使得我们不使用__autoload,使用自定义的函数来进行自动加载成为可能。这个方法现在是经常使用到的。

  Zend的AutoLoader模块就使用了这个方法。摘录其中对应的代码http://my.oschina.net/u/2297790/blog/389275

© 著作权归作者所有

粉丝 0
博文 22
码字总数 18644
作品 0
武汉
私信 提问
PHP基础学习之SPL Autoload机制

PHP基础学习之SPL Autoload机制 果冻想2018-03-172 阅读 PHP 前言 上一篇文章总结了PHP中的 机制。这一篇是上一篇的姊妹篇。关于 现在基本都被抛弃了,使用的越来越少了,但是语言的发展都是...

果冻想
2018/03/17
0
0
php autoload机制学习

在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个单独的文件里,这样会很容易实现对类进行复用,同时将来维护时也很便利。这也是OO设计的基本思想之一。在PHP5之前,...

babygo
2014/01/13
0
0
PHP autoload机制详解

PHP autoload机制详解 转载自 jeakccc PHP autoload机制详解 (1) autoload机制概述 在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个单独的文件里,这样会很容易实现...

晨曦之光
2012/03/09
251
0
PHP的autoload机制的实现解析

PHP的autoload机制的实现解析 在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个单独的文件里,这样会很容易实现对类进行复用,同时将来维护时也很便利 一、autoload机...

daniel-john
2015/08/27
0
0
PHP autoload 函数

PHP autoload 函数 (1) autoload机制概述 在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个单独的文件里,这样会很容易实现对类进行复用,同时将来维护时也很便利。这...

niceguy_php
2012/12/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

二进制位操作

单片机,或者一些模块的设置操作,都是由一个字节数据来完成,每位各有定义。就需进行位操作来组合需要的数字结果。 以JavaScript为例,编写位操作。 我们期望得到这样一个二进制数:0101101...

format
22分钟前
2
0
聊聊中国的通信行业:从“七国八制”到“中华”脊梁

本期文章和大家一起来聊一聊我曾经从事过的通信行业吧。最近各方面信息的泛滥,包括和华为的同学聊天,自己确实也感慨颇多。想想我自己本科主修通信工程,研究生再修信息与通信工程,从本科开...

CodeSheep
今天
6
0
MDK:ARM M451M:exceed the range of code meory, continue to erase or not?

问题: 代码空间超限 几天前就遇到:exceed the range of code meory, continue to erase or not? 如下所示: 解决过程 开始以为中MDK软件的128KB限制,如是就不能生成HEX文件,应该链接时有提...

SamXIAO
今天
1
1
OSChina 周六乱弹 —— 因违反《中华人民共和国治安管理处罚法》第四十四条之规定

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @xiaoshiyue :#今日歌曲推荐# 惊艳分享谷微的单曲《安守本份》(@网易云音乐) 《安守本份》- 谷微 手机党少年们想听歌,请使劲儿戳(这里) ...

小小编辑
今天
495
12
Angular 英雄编辑器

应用程序现在有了基本的标题。 接下来你要创建一个新的组件来显示英雄信息并且把这个组件放到应用程序的外壳里去。 创建英雄组件 使用 Angular CLI 创建一个名为 heroes 的新组件。 ng gener...

honeymoose
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部