PHP 学习笔记 Autoload

刚接触PHP,往往会被PHP文件结构搞晕,类似于C++,需要用到其他文件中的类或方法时,需要将类或方法的定义引入进来。同样类似于C++,PHP可以使用 include。不同的是,除了include,PHP还提供了另一个函数require。所以我们先看一下require和include 的区别。

一、 require和include异同

  • 相同点
他们都是语言结构,不是真正的函数。 既可以require('sonme.php') 也可以 require 'some.php'。

都有另一个函数 require_once,include_once ,表示已加载的不加载。

  • 不同点
引入文件遇到错误,include 继续运行下面代码;require 停止运行。

引入条件:include()是有条件包含函数,而require()则是无条件包含函数。require 在PHP编译时将内容引入,所以不论放在哪,都是首先执行。include是运行时才会引入。所以,require()通常来导入静态的内容,而include()则适合用导入动态的程序代码。

二、autoload

PHP 5 提供魔术函数 _autoload,当调用的类找不到时,将类名传入,再给一次引入类声明的机会。

function __autoload($class_name)
{
    if (file_exists($class_name . '.php')) {
        require_once $class_name . '.php';
    } elseif (file_exists('../Entity/' . $class_name . '.php')) {
        require_once '../Entity/' . $class_name . '.php';
    }
}
但是在交叉引用中,可能导致_autoload多次定义,出现错误。

所以在PHP 5.1.2 以后支持自定义autoload函数,通过spl_autoload_register()将函数注册到队列中。

function my_autoloader($class) {
    include 'classes/' . $class . '.class.php';
}

spl_autoload_register('my_autoloader');

三、分析项目组框架pylon中autoload用法

function pylonlib__autoload($classname)
{
    $key     = "PYLON2_CLASS:" . $classname;
    $glogger = new logger("_pylon");
    $path    = pylon_dict_find($key);
    if ($path != null) {
        $glogger->debug("cls : $classname , file: $path", "autoload");
        if (extension_loaded("Zend OPcache")) {
            include_once realpath("$path");
        } else {
            include_once "$path";
        }
        return;
    }
}
上述代码中将特定字符串与类名拼接作为key在之前导入的字典中查找类对应的文件路径,如果找到,则include。

这里将类名和路径作为键值提前记录好存储起来以供查询用。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值