在一些以前的项目,或者是一些小型的项目里面,一般来说文件的载入一般有两种办法:
a.require
b.include
下面的代码就是引入两个php文件,分别是Test1.php和Test2.php,并且执行类Test1和Test2里面的test1()和test2()方法。
<?php
require 'Test1.php'; //require '文件的路径';
include 'Test2.php'; //include '文件的路径';
Test1::test1();
Test2::test2();
又或者是这样:
/* 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文件,这样管理起来和开发就会十分不方便。
在PHP5之后,人们就可以通过 __autoload函数来解决这个问题。当通过 new 来实例化一个类时,PHP会通过定义的__autoload 函数加载相应的文件,如果这个类文件使用了 extends 或者 implements 需要用到其他的类文件,php会重新运行 autoload 去进行类文件的查找和加载,如果发生了两次对同一类文件的请求,就会报错。
<?php
Test1::test1();
Test2::test2();
function __autoload($class)
{
require __DIR__.'/'.$class.'.php';
}
但是这种办法也有其缺点,如果在一个系统的实现中,如果需要使用很多其它的类库,这些类库可能是由不同的开发人员编写的,其类名与实际的磁盘文件的映射规则不尽相同。这时如果要实现类库文件的自动加载,就必须在__autoload()函数中将所有的映射规则全部实现,这样的话__autoload()函数有可能会非常复杂,甚至无法实现。最后可能会导致__autoload()函数十分臃肿,这时即便能够实现,也会给将来的维护和系统效率带来很大的负面影响。
spl_autoload_register出现在PHP5.2,他取代了原来__autoload()的地位,它的好处在于可以同时存在多个__autoload 函数。
<?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';
}
也可以这样写:
<?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");
小结:自动加载可以使得我们的操作更简便,经常需要自动加载一些默认配置,因此掌握自动加载的实现是非常重要的!