php自动加载机制

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

?>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值