前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >php类的自动载入(lazy load)

php类的自动载入(lazy load)

作者头像
NateHuang
发布2018-03-14 11:25:59
7560
发布2018-03-14 11:25:59
举报
文章被收录于专栏:开发经验记录

类的自动载入

一、require时代(手动载入)

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

a.require

b.include

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

代码语言:javascript
复制
<?php

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

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

 又或者是这样:

代码语言:javascript
复制
/* 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 去进行类文件的查找和加载,如果发生了两次对同一类文件的请求,就会报错。

代码语言:javascript
复制
<?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 函数。

代码语言:javascript
复制
<?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';
}

也可以这样写:

代码语言:javascript
复制
<?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");

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 类的自动载入
    • 一、require时代(手动载入):
      • 二、__autoload()时代(自动加载):
        • 三、spl_autoload_register时代(更完美的自动加载):
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档