php自动加载机制
__autoload()
官方已经不建议用这种用法,缺点只能定义一种规则去自动加载类
实例
<?php
A.php
class A
{
public function __construct()
{
echo 'A';
}
}
//自定义 __autoload 函数,它定义了类文件的加载方式
function __autoload($classname) {
require $classname.'.php';
}
//实例化的时候会优先找当前文件
$A = new A();//输出A
//如果不存在则自动调用 __autoload 函数并将类名 B 作为参数传递给这个函数,引入类文件。
//(注意:B名要和文件名对应)
$B = new B();//输出B
$C = new C();//报错 ..Fatal error: require(): Failed opening required 'C.class.php'
B.php
?>
<?php
class B
{
public function __construct()
{
echo 'B';
}
}
?>
spl_autoload_register
可重复调用,定义多个规则 页面有多个 spl_autoload_register ,执行顺序是按照注册的顺序,一个一个往下找,如果找到了就停止。
实例
#controller/Acontroller.php
<?php
class Acontroller
{
public function __construct()
{
echo 'Acontroller';
}
}
?>
#model/AModel.php
<?php
class AModel
{
public function __construct()
{
echo 'Amodel';
}
}
?>
#index.php
<?php
//定义加载model规则
function loadModel($className)
{
$filename = 'model/'.$className.'.php';
if (file_exists($filename))
require $filename;
}
//定义加载controller规则
function loadController($className)
{
$filename = 'controller/'.$className.'.php';
if (file_exists($filename))
require $filename;
}
// 注册两个加载函数
spl_autoload_register("loadModel");
spl_autoload_register("loadController");
$Amodel = new AModel(); //输出Amodel
$Acontroller = new Acontroller(); //输出Acontroller
?>
spl_autoload_register和namespace
实例
#controller/Acontroller.php
<?php
namespace controller;
class Acontroller
{
public function __construct()
{
echo 'Acontroller';
}
}
?>
#model/AModel.php
<?php
namespace model;
class AModel
{
public function __construct()
{
echo 'Amodel';
}
}
?>
#autoload.php
//定义加载model规则
function loadModel($className)
{
$filename = $className.'.php';//如果使用了命名空间,传入的类名会带上命名空间 model\AModel.php
$filename = str_replace('\\', '/', $filename); //把反斜杠转成正斜杠 model/AModel.php
if (file_exists($filename))
require $filename;
}
//定义加载controller规则
function loadController($className)
{
$filename = $className.'.php';
$filename = str_replace('\\', '/', $filename);
if (file_exists($filename))
require $filename;
}
// 注册两个加载函数
spl_autoload_register("loadModel");
spl_autoload_register("loadController");
#index.php
<?php
namespace index;
require './autoload.php';
//引入命名空间
use controller\Acontroller;
use model\AModel;
$Amodel = new AModel(); //如果使用了命名空间,传入的类名会带上命名空间 model\AModel //输出Amodel
$Acontroller = new Acontroller();//Acontroller
?>