php类的自动载入(lazy load)

类的自动载入

一、require时代(手动载入)

在一些以前的项目,或者是一些小型的项目里面,一般来说文件的载入一般有两种办法:

a.require

b.include

下面的代码就是引入两个php文件,分别是Test1.php和Test2.php,并且执行类Test1和Test2里面的test1()和test2()方法。

<?php

require 'Test1.php';   //require '文件的路径';
include 'Test2.php';   //include '文件的路径';

Test1::test1();
Test2::test2();

 又或者是这样:

/* Person.class.php */

<?php

class Person {

    var $name, $age;

    function __construct ($name, $age)

    {

        $this->name = $name;

        $this->age = $age;

    }

}

?>


/* no_autoload.php */

<?php

    require_once (”Person.class.php”);

    $person = new Person(”Altair”, 6);

    var_dump ($person);

?>

在这种使用方法下,如果项目比较庞大,那么将会出现大量的require和include文件,这样管理起来和开发就会十分不方便。

二、__autoload()时代(自动加载):

在PHP5之后,人们就可以通过 __autoload函数来解决这个问题。当通过 new 来实例化一个类时,PHP会通过定义的__autoload 函数加载相应的文件,如果这个类文件使用了 extends 或者 implements 需要用到其他的类文件,php会重新运行 autoload 去进行类文件的查找和加载,如果发生了两次对同一类文件的请求,就会报错。

<?php

Test1::test1();
Test2::test2();

function __autoload($class)
{
    require __DIR__.'/'.$class.'.php';
}

但是这种办法也有其缺点,如果在一个系统的实现中,如果需要使用很多其它的类库,这些类库可能是由不同的开发人员编写的,其类名与实际的磁盘文件的映射规则不尽相同。这时如果要实现类库文件的自动加载,就必须在__autoload()函数中将所有的映射规则全部实现,这样的话__autoload()函数有可能会非常复杂,甚至无法实现。最后可能会导致__autoload()函数十分臃肿,这时即便能够实现,也会给将来的维护和系统效率带来很大的负面影响。

三、spl_autoload_register时代(更完美的自动加载):

spl_autoload_register出现在PHP5.2,他取代了原来__autoload()的地位,它的好处在于可以同时存在多个__autoload 函数。

<?php

sql_autoload_register('autoload1');
sql_autoload_register('autoload2');

Test1::test1();
Test2::test2();

function autoload1($class)
{
    require __DIR__.'/'.$class.'.php';
}

function autoload2($class)
{
    require 'otherdir/'.$class.'.php';
}

也可以这样写:

<?php

class autoload

{

    public static function load($className)

    {

        $name = str_replace('\\', '/', $className);

        $fileName = sprintf('%s.php', $name);

        if (is_file($fileName)) {

            require_once $fileName;

        }

        // var_dump($fileName);

    }

}

// 这样写也可以的

// spl_autoload_register(array("autoload", "load"));

spl_autoload_register("autoload::load");

小结:自动加载可以使得我们的操作更简便,经常需要自动加载一些默认配置,因此掌握自动加载的实现是非常重要的!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏前端桃园

ES6之路之模块详解

1343
来自专栏极客编程

基于Node.js的自动化工具Gulp

gulp是前端开发过程中一种基于流的代码构建工具,是自动化项目的构建利器;她不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成;...

2341
来自专栏精讲JAVA

Java 9 新特性,看这里就明白了

摘要: 1.目录结构 2.repl工具 jShell命令 3.模块化 4.多版本兼容jar包 5.接口方法的改进(在接口中 jdk7 只能声明全名常量...

3716
来自专栏大史住在大前端

webpack4.0各个击破(8)—— tapable篇

tapable是webpack的核心框架(4.0以上版本的API已经发生了变化),是一个基于事件流的框架,或者叫做发布订阅模式,或观察者模式,webpack的整...

1343
来自专栏java一日一条

怎样处理InterruptedException

Java 中的受检查异常 InterruptedException 如何处理是令人头痛的问题,下面是我对处理这个问题的理解。

1582
来自专栏Android常用基础

粗谈Java虚拟机之原理与结构

在学习java虚拟机之前,我们有必要先来了解下下class文件与dex文件。相比大家对这两文件都耳熟能详,但是对于初学者来说却是"听起声而不见其人"。下面我们就...

971
来自专栏哲学驱动设计

OEA ORM 框架中的冗余属性设计

OEA 框架提供了多种方式来优化分布式数据查询的性能,本篇将会说明如何以声明 OEA 冗余属性的方式,来实现轻量级的数据冗余,以减少关联查询次数及网络数据传输量...

2409
来自专栏编程

java编程思想之并发

编程问题中的相当一大部分都可以通过顺序编程来解决。然而,对于某些问题,如果能够并行的执行程序中的多个部分,则会变得非常方便甚至非常必要,这些部分要么可以并发执行...

2107
来自专栏java思维导图

Java 9 新特性,看这里就明白了

摘要: 1.目录结构 2.repl工具 jShell命令 3.模块化 4.多版本兼容jar包 5.接口方法的改进(在接口中 jdk7 只能声明全名常量...

3336
来自专栏Java帮帮-微信公众号-技术文章全总结

day27.MongoDB【Python教程】

集合:类似于关系数据库中的表,储存多个文档,结构不固定,如可以存储如下文档在一个集合中

1183

扫码关注云+社区

领取腾讯云代金券