__autoload()方法并不是类定义的相关方法,而是一种PHP文件自动加载机制,但它主要是针对“类”,所以,我们就在本章一起介绍了。
在一个PHP文件中,如果我们使用了一个当前文件内没有定义过的类,就可以利用系统中定义的__autoload()方法自动查询相应的PHP文件;习惯的用法是,将每一个类的定义以同名的.php文件存放在固定的位置,如我们前面使用过的/lib目录下,这样,我们就可以通过类的名称很方便地找到相应的.php文件了。
如下面的代码,我们首先创建/lib/CDemo.php文件,其中定义了CDemo类。
<?php
class CDemo
{
public static $author = 'caohuayu.com';
public function showInfo()
{
echo 'PHP Library';
}
}
?>
在CDemo类中,我们定义了一个静态变量$author和一个实例方法showInfo()。接下来,我们的工作就是创建__autoload()方法,这是一个系统级的方法,如何定义呢?
在项目中,可能有很多系统资源需要配置和初始化,我的方案是在/lib目录中创建一个名为init.php的文件,它的作用就是完成PHP环境中通用的配置与资源初始化工作,我们就将__autoload()方法定义在这个文件中吧。如下面的代码。
<?php
function __autoload(className)
{ require_once_SERVER["DOCUMENT_ROOT"]."/lib/$className.php";
}
?>
现在,我们返回index.php文件,创建如下代码。
<?php
require_once _SERVER['DOCUMENT_ROOT'].'/lib/init.php';
echo CDemo::author; // 显示caohuayu.com
echo '<br>';
demo = new CDemo();demo->showInfo(); // 显示PHP Library
?>
代码中,我们并没有直接引用CDemo.php文件,但是,我们可以看到,当我们使用CDemo类时,无论是使用它的静态成员,或者创建它的实例(对象),通过init.php文件中定义的__autoload()方法,都能够自动加载CDemo.php文件。
使用__autoload()方法需要注意的是,如果指定规则下找不到相应的类文件,则会产生错误,此时,我们应该有一个系统的错误处理机制来处理,因为代码找不到类的定义,是没有办法再正确的执行下去了。