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

相关文章

来自专栏技术换美食换不换

php

htmllentitles()/unhtml()/urlencode()/urldecode/

761
来自专栏章鱼的慢慢技术路

《算法图解》第五章笔记与课后练习

1584
来自专栏安恒网络空间安全讲武堂

CVE-2018-14421 Seacms 后台getshell分析

最近看到关注的博客里面,有一篇师傅拿cve的文章,是有关于海洋cms的后台getshell,只给出了exp,但是并没有详细的分析流程,好奇心的驱使下,开始了对这...

742
来自专栏xingoo, 一个梦想做发明家的程序员

Java程序员的日常 —— 《编程思想》包和访问权限

包的作用 在C++中有命名空间的概念,这是因为,不同的项目或者人写出来的代码,可能名称是一样的。比如,java.util中有List,java.awt中也有...

1748
来自专栏PHP技术

PHP输入流php://input介绍

在使用xml-rpc的时候,server端获取client数据,主要是通过php输入流input,而不是$_POST数组。所以,这里主要探讨php输入流php:...

3255
来自专栏IMWeb前端团队

关于javascript错误捕获

``` javascript的出错我们应该都很熟悉,例如`xxx undefined`,`SyntaxError`等。 我们team将出现错误的javas...

1967
来自专栏章鱼的慢慢技术路

《算法图解》第五章笔记与课后练习_散列函数与散列表

1655
来自专栏美团技术团队

RestQL:现代化的 API 开发方式

koa-restql 已经在 github 开源并在 npm 发布。感兴趣的同学可以前往围观一下。欢迎 Pull Request,同时热烈欢迎 Star。 在现...

3615
来自专栏腾讯IVWEB团队的专栏

关于 javascript 错误捕获

我们team将出现错误的javascript代码取名为badjs,也有一个开源的badjs项目,用于捕获和分析js错误,并提供了一些基础的报表数据分析。

2300
来自专栏ml

C/C++ 关于生成静态库(lib)/动态库(dll)文件如何使用(基于windows基础篇)

1. 首先,如何制作一个静态库(lib)?            额, 对于静态库,我们知道,里头是不应该有Main函数,它只是一个配合文件。之所以称之为lib...

5295

扫码关注云+社区