说说PHP的autoLoad

简介:

php的autoload大致可以使用两种方法:__autoload和spl方法。这两种方法又各有不同的几种使用方法。

 

__autoload的使用方法1:

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

1
2
3
4
5
6
7
8
function __autoload($class_name) {
     $path = str_replace( '_' '/' , $class_name);
     require $path .  '.php' ;
}
 
// 这里会自动加载Http/File/Interface.php 文件
 
$a =  new  Http_File_Interface();

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
$map = array(
     'Http_File_Interface'  =>  'C:/PHP/HTTP/FILE/Interface.php'
);
 
function __autoload($class_name) {
     if  (isset($map[$class_name])) {
         require $map[$class_name];
     }
}
 
// 这里会自动加载C:/PHP/HTTP/FILE/Interface.php 文件
 
$a =  new  Http_File_Interface();
1
  
1
  
1
这种方法的好处就是类名和文件路径只是用一个映射来维护,所以当文件结构改变的时候,不需要修改类名,只需要将映射中对应的项修改就好了。

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

spl_autoload

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

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

 

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

 

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

先了解spl的几个函数:

clip_image001

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

 

Spl_autoload实现自动加载:

/*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函数栈中,直接看一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*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中注册的调用函数, 看下面的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/*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模块就使用了这个方法。摘录其中对应的代码

1
2
3
4
5
6
7
spl_autoload_register( array ( __CLASS__ , 'autoload' ));
 
public  static  function  autoload( $class )
   {
     …..
 
   }
目录
相关文章
|
PHP C语言 数据库
PHP自动加载__autoload的工作机制
PHP自动加载__autoload的工作机制  PHP的懒加载lazy loading 在 2011年11月12日 那天写的     已经有 4559 次阅读了 感谢 参考或原文   服务器君一共花费了11.683 ms进行了2次数据库查询,努力地为您提供了这个页面。
746 0
|
PHP 数据格式 JSON
说说PHP的autoLoad自动加载机制
说说PHP的autoLoad自动加载机制 作者: 字体:[增加 减小] 类型:转载   php的autoload大致可以使用两种方法:__autoload和spl方法。这两种方法又各有不同的几种使用方法   __autoload的使用方法1: 最经常使用的就是这种方法,根据类...
990 0
|
PHP 数据格式 XML
PHP中Autoload使用中的一些问题
PHP中提供了Autoload来帮助我们方便的进行文件的包含,但是autoload并非想象的那样能够处理所有的情况,今天就来记录一下前几天遇到的autoload存在的一些问题。 为什么要使用 Autoload。
944 0
|
3月前
|
安全 关系型数据库 MySQL
PHP与MySQL交互:从入门到实践
【9月更文挑战第20天】在数字时代的浪潮中,掌握PHP与MySQL的互动成为了开发动态网站和应用程序的关键。本文将通过简明的语言和实例,引导你理解PHP如何与MySQL数据库进行对话,开启你的编程之旅。我们将从连接数据库开始,逐步深入到执行查询、处理结果,以及应对常见的挑战。无论你是初学者还是希望提升技能的开发者,这篇文章都将为你提供实用的知识和技巧。让我们一起探索PHP与MySQL交互的世界,解锁数据的力量!
|
3月前
|
NoSQL 关系型数据库 MySQL
不是 PHP 不行了,而是 MySQL 数据库扛不住啊
【9月更文挑战第8天】这段内容讨论了MySQL在某些场景下面临的挑战及其原因,并指出这些问题不能完全归咎于MySQL本身。高并发读写压力、数据量增长以及复杂查询和事务处理都可能导致性能瓶颈。然而,应用程序设计不合理、系统架构不佳以及其他数据库选择和优化策略不足也是重要因素。综合考虑这些方面才能有效解决性能问题,而MySQL通过不断改进和优化,仍然是许多应用场景中的可靠选择。
156 9
|
4月前
|
存储 SQL 关系型数据库
PHP与MySQL交互的奥秘
【8月更文挑战第29天】在编程的世界里,PHP和MySQL就像是一对默契的舞伴,共同演绎着数据的交响曲。本文将带你探索它们之间的互动,从连接数据库到执行查询,再到处理结果,每一步都充满了节奏与和谐。我们将一起走进这段代码的旅程,感受数据流动的魅力。
|
22天前
|
关系型数据库 MySQL PHP
PHP与MySQL动态网站开发实践指南####
深入探索PHP与MySQL结合的魅力,本文旨在通过一系列实战案例,揭示如何高效构建动态交互式网站。从环境搭建到代码实现,全方位解析两者协同工作的原理与技巧,为开发者提供一条清晰的学习路径。 ####