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

相关文章

来自专栏pangguoming

Spring Boot集成JasperReports生成PDF文档

由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲...

1.2K7
来自专栏张善友的专栏

LINQ via C# 系列文章

LINQ via C# Recently I am giving a series of talk on LINQ. the name “LINQ via C...

2625
来自专栏张善友的专栏

Silverlight + Model-View-ViewModel (MVVM)

     早在2005年,John Gossman写了一篇关于Model-View-ViewModel模式的博文,这种模式被他所在的微软的项目组用来创建Expr...

2928
来自专栏陈仁松博客

ASP.NET Core 'Microsoft.Win32.Registry' 错误修复

今天在发布Asp.net Core应用到Azure的时候出现错误InvalidOperationException: Cannot find compilati...

4818
来自专栏Ceph对象存储方案

Luminous版本PG 分布调优

Luminous版本开始新增的balancer模块在PG分布优化方面效果非常明显,操作也非常简便,强烈推荐各位在集群上线之前进行这一操作,能够极大的提升整个集群...

3095
来自专栏一个会写诗的程序员的博客

Spring Reactor 项目核心库Reactor Core

Non-Blocking Reactive Streams Foundation for the JVM both implementing a Reactiv...

2122
来自专栏C#

DotNet加密方式解析--非对称加密

    新年新气象,也希望新年可以挣大钱。不管今年年底会不会跟去年一样,满怀抱负却又壮志未酬。(不过没事,我已为各位卜上一卦,卦象显示各位都能挣钱...)...

4818
来自专栏我和未来有约会

Kit 3D 更新

Kit3D is a 3D graphics engine written for Microsoft Silverlight. Kit3D was inita...

2506
来自专栏杨龙飞前端

scrollto 到指定位置

2494
来自专栏张善友的专栏

Miguel de Icaza 细说 Mix 07大会上的Silverlight和DLR

Mono之父Miguel de Icaza 详细报道微软Mix 07大会上的Silverlight和DLR ,上面还谈到了Mono and Silverligh...

2667

扫码关注云+社区