浅谈PHP中自动加载类库机制

来源:互联网 发布:淘宝网大童店铺 编辑:程序博客网 时间:2024/06/18 07:29

在php开发过程中,在写面向对象程序时都需要对每个类建立一个PHP源文件,其中一个很大的麻烦就是不得不在每个脚本开头写一个长长的类包含文件(include or require函数)。虽然,对于一个小的php项目来说,没什么大的问题,但是对于大型的PHP开发项目中,这么做会产生大量的require和include方法调用,这样不仅效率低下,而且不易于维护。


在PHP5之后,不需要这样了,我们可以自己定义一个__autoload函数,如果类所在文件没有被包含进来,或者类名出错,Zend引擎会自动调用__autoload函数,但是次函数需要用户自己实现__autoload函数。在PHP5.1.2版本之后,可以使用spl_autoload_register函数自定义加载处理函数(一种更加灵活的方式来实现类的自动加载)。


1、__autoload( )

<?php function __autoload($_className) {        echo "Aotuload class:" . $_className . '.class.php';    }    new Test();?>

输出:Aotuload class:Test.class.php

在我们利用MVC做项目时,会用到控制器和模型,那么我们是如何自动调用所需要的控制器类和模型类的呢,下面为大家解释下。

笔者这里命名的控制器类名和模型类名分别是:TestAction.class.php和TestModel.class.php,其实除了大多使用的控制器类和模型类之外还有很的类,例如工具类等等,为大家说明下系统是如何调用的。

function __autoload ($_className) {//加载控制器类if (substr($_className, -6) == 'Action') {require ROOT_PATH . '/action/' . $_className . '.class.php';} elseif (substr($_className, -5) == 'Model') {//加载模型类require ROOT_PATH . '/model/' . $_className . '.class.php';} else {//加载其他类require ROOT_PATH . '/includes/' . $_className . '.class.php';}}

我们可以看出_autoload至少要做三件事情:

第一件事是根据类名确定类文件名;

第二件事是确定类文件所在的磁盘路径;

第三件事是将类从磁盘文件中加载到系统中。

第三步最简单,只需要使用include/require即可。要实现第一步,第二步的功能,必须在开发时约定类名与磁盘文件的映射方法,只有这样我们才能根据类名找到它对应的磁盘文件。 


相信大家应该懂得为什么控制器和模型类通常会以***Action和***Model开头的命名方式了吧,其中很大一方面原因是为了开发时约定类名和磁盘文件的映射的实现。


当然,除了__autoload()自动加载函数外,PHP提供的spl_autolad_register()函数也是非常的灵活和方便的,可以自行查阅以下,这里不再赘余。


(完)


0 0
原创粉丝点击