php包管理机制-支持php5.3的方法

PHP Jenner 9889℃

composer作为目前主流的php包管理器,使得我们组合不同功能的php代码非常容易,开发也可以更专注某一个模块了。而composer要求我们的php版本不低于php5.3,虽然php5.3也能跑,但不保证不会有问题。而相信目前国内很多公司的php版本仍然停留在php5.3以下的时代,或者由于自身实现了autoload,很难与composer组合到一起,虽然对composer的功能很喜欢,但也只能望而却步。

我们接触最多的php开发,就是MVC了,我们一般只需要编写M、V、C的代码即可,这些框架一般都有提供。但如果框架如果不是很强大的话,例如我们希望在写错误日志的同时,发送报警,相信会有一些框架难以做到这一点。为此你不得不再编写一些helper工具类来帮你实现你想要的。类似的场景会有很多,系统复杂度越高,我们需要的就越多,而框架就有可能在这个时候显得力不从心。

解决上面的问题,我们需要能够灵活的向框架中注入不同的模块,而不影响现有的代码。如何实现呢?spl_autoload_register()函数能够帮我们做到这一点。

 

下面我假设一个场景,然后利用spl_autoload_register()函数完成我们的模块注入。

假设,我们有一个php5.2的项目,非常复杂,autoload自动加载会扫描很多目录,同时会做autoload缓存,以便提升autoload性能。

如果我们添加一个功能包,除了修改__autoload函数外,我们还可以使用spl_autoload_register,这个函数像是一个注册器,每次调用,都会在一个注册树上注册一个autload函数,当你需要使用一个尚未载入的class时,php会自动从注册树顶部开始调用你所注册的autoload函数,直到找到你要载入的类为止。

利用spl_autoload_register的这个功能,我可以首先要做的事情就是修改我们的__autoload函数,因为如果你使用了__autoload函数,则会清空注册树上的函数。我们必须把我们之前编写的autoload函数同样的注册到注册树上才可以与其他autoload共存。具体看如下示例。

首先假设我们系统的__autoload函数类似如下:

function __autoload($class_name){
    $filename = FRAMEWORK_DIR . '/' . $class_name . '.class.php';
    if(file_exists($filename)){
        require $filename;
    }
}

我们只需要做如下修改即可:

function myAutoload($class_name){
    $filename = FRAMEWORK_DIR . '/' . $class_name . '.class.php';
    if(file_exists($filename)){
        require $filename;
    }
}

spl_autoload_register('myAutoload');

做完这一步,你可以测试你的系统能否正常运行,至此我们完成了第一步。

下面我们需要注入我们想使用的包,假设我们在github上找到了一个不错的包,但是它需要命名空间支持,所以我们做了些修改,去掉了命名空间。我们希望把这个包注入到我们的系统中。

我们需要做的就是为这个包编写一个autoload函数,然后调用spl_autoload_register()函数,把它注册到注册树上。类似如下:

function githubPackageAutoload($class_name){
    $filename = GITHUB_PACKAGE_PATH . '/' . $class_name . '.class.php';
    if(file_exists($filename)){
        require $filename;
    }
}
spl_autoload_register('githubPackageAutoload');

至此我们完成了php功能包的注入。

 

 

原创文章,转载请注明: 转载自始终不够

本文链接地址: php包管理机制-支持php5.3的方法

转载请注明:始终不够 » php包管理机制-支持php5.3的方法

喜欢 (0)