在new PHP类的时候一般先要包含该类的实现文件。我们用require就可以做到。如果在一个文件中要使用很多的类,那么我们就需要包含很多的require语句了。这个虽然没问题,但感觉有点繁琐。能否智能化呢?
当然,PHP提供了一个自动注册函数 function __autoload($class)
这个函数接受一个参数,该参数为一个字符串,需要加载的类名。我们可以在文件中加上上面的代码:
function __autoload($class)
{
$class = strtolower($class);
$file = "class.".$class.'.php';
if(is_file($file))
{
require_once($file);
}
}
那么当我们new 一个类的时候,如果类的文件不存在,那么系统就会自动调用__autoload函数,帮我们加载类文件了。
当然,这个函数的名称是固定的,不能够改变。必须为__autoload.那么你就会想,如果我不喜欢这个__autoload名称,那就没办法了吗?办法还是有的。我们可以用spl_autoload_register来实现。
bool spl_autoload_register([callback $autoload_function])
参数:需要注册的自动加载回调函数,如果为空,那么默认为__autoload
返回值:如果成功加载返回TRUE否则返回FALSE.
那么现在的代码就会变为:
function myAutoloader($class)
{
$class = strtolower($class);
$file = "class.".$class.'.php';
if(is_file($file))
{
require_once($file);
}
}
spl_autoload_register('myAutoloader');
//require("class.a.php");
$testA = new testA();
当系统遇到没有定义的类的时候,就会调用我们的myAutoLoader来尝试加载文件了。
在面向对象的时代,能否使自动加载函数和一个对象相关呢?可以,看代码:
class loader{
static function myAutoloader($class)
{
$class = strtolower($class);
$file = "class.".$class.'.php';
if(is_file($file))
{
require_once($file);
}
}
}
spl_autoload_register(array('loader','myAutoloader'));
//require("class.a.php");
$testA = new testA();
请注意,其中的static关键字。也就是说只能够使用类的静态方法。
当然你可以同时注册多个自动加载函数:
class loader{
static function myAutoloader($class)
{
$class = strtolower($class);
$file = "class.".$class.'.php';
if(is_file($file))
{
require_once($file);
}
}
static function youAutoloader($class)
{
$class = strtolower($class);
$file = $class.'.php';
if(is_file($file))
{
require_once($file);
}
}
}
spl_autoload_register(array('loader','myAutoloader'));
spl_autoload_register(array('loader','youAutoloader'));
//require("class.a.php");
$testA = new testA();
系统会按照你的注册顺序以此超找。如果找到就返回,不再继续查找。