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 条评论
登录 后参与评论

相关文章

来自专栏IT派

Python3.7中一种懒加载的方式

Python3.7在模块上也添加了__getattr__()和__dir__()两个方法。这个新特性让我们能够实现一些有趣的事情。例如,通过定义__dir__方...

900
来自专栏企鹅号快讯

使用postman快速建立MOCK使用篇

首先介绍一下Mock,借用一下百度百科解释:mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法, 其...

3875
来自专栏编程

如何扩展一个自定义SOP节点

平安夜祝大家平平安安,以后的文章关于C++语言方面的内容会多一些,不太理解的话就当一乐子看,了解一下Houdini底层架构知识也是好的。能保证的是文章的内容都是...

1986
来自专栏SDNLAB

Ryu的一些设计方法解读

作为一个业余研究Ryu的软件工程师,一直惊叹于Ryu设计的优雅与简洁。一年多坚持下来,也有自己的一些收获,写出来和大家分享一下。 我们的故事从@set_ev_c...

2786
来自专栏前端架构

php autoload 机制探索

autoload机制是php的一个容错机制,提供了一种在没有预先加载相关类的情况下,不让程序出错,继续执行的机制.

462
来自专栏技术小黑屋

Ruby常用文件操作

初学Ruby,很多需要学习,现在开始尝试使用Ruby来写一个脚本,其中用到了很多文件相关的操作,这里阶段地整理一些。便于后续的再次查找。

472
来自专栏双十二技术哥

一个Android路由框架的诞生之路

在这个过程中一直强调了组件化的一个基础设施:路由!没有它组件化可以说是寸步难行,本篇文章我们就来谈谈一个组件化路由框架诞生过程中的那些思考。

632
来自专栏林德熙的博客

WPF 如何调试 binding

如果是写在 xaml 的绑定,很难看到是那里出错 如何做 vs 调试 binding?

221
来自专栏编舟记

如何在@SpringBootTest中动态地启用不同的profiles

这个类存在的意义就是为了让其它类别的 ResourceTest 继承它,并在一次启动当中运行完所有的集成测试。避免每个 ResourceTest 都初始化启动 ...

963
来自专栏学习力

《Java从入门到放弃》框架入门篇:hibernate基本配置

1765

扫描关注云+社区