PHP自动加载 spl_autoload_register

内容描述:
     刚开始自学PHP的时候,一个功能类单独写一个文件,引入类文件时用 require_once "类文件路径";后来工作中接触thinkPHP3.2.3框架,发现框架中引入类文件的方式用的是 命名空间 配合 spl_autoload_register() 实现的自动加载;

一、无命名空间同一个目录下

目录结构


MyClass1.class.php文件内容:
<?php
class MyClass1
{
    function __construct()
    {
        echo 'This is MyClass1 <br>';
    }
}



MyClass2.class.php文件内容:
<?php
class MyClass2
{
    function __construct()
    {
        echo 'This is MyClass2 <br>';
    }
}



index.php文件内容:
<?php
//自动加载
spl_autoload_register(function ($class_name) {
    require_once $class_name . '.class.php’;
});

$obj  = new MyClass1();
$obj2 = new MyClass2();

echo 'END <br>’;



运行效果:https://www.httpsdomain.com/index.php
This is MyClass1 
This is MyClass2 
END 

OK

二、有命名空间,不在同一个目录中的类

目录结构如下:

/Animal/Cat.class.php文件内容如下:
<?php
namespace Animal;
class Cat
{
    function __construct()
    {
        echo 'This is a Cat Class!<br>';
    }
}



/Anima/Dog.class.php文件内容如下:
<?php
namespace Animal;
class Dog
{
    function __construct()
    {
        echo 'This is a Dog Class!<br>';
    }
}



如果不使用自动加载,按照原有的require_once,那么
/index.php文件内容如下:
<?php

require_once "Animal/Dog.class.php";

$dog = new Dog();

echo 'END <br>’;




如果使用自动加载,那么/index.php文件内容如下:
<?php
//自动加载
spl_autoload_register(function ($class_name) {
    $class_name = str_replace('\\','/', $class_name); /*将 use语句中的’\’替换成’/‘,避免造成转移字符导致require_once时会报错*/
    require_once $class_name . '.class.php';        /*文件的后缀名是 .class.php*/
});
use Animal\Dog;

$dog = new Dog();

echo 'END <br>’;



运行结果:

如果不在代码开头写 user Animal\Cat;那么在实例化类时,就必须写完整的类路径。/index.php文件内容如下:
<?php
//自动加载
spl_autoload_register(function ($class_name) {
    $class_name = str_replace('\\','/', $class_name); /*将 use语句中的’\’替换成’/‘,避免造成转移字符导致require_once时会报错*/
    require_once $class_name . '.class.php’;        /*文件的后缀名是 .class.php*/
});
use Animal\Dog;

$dog = new Dog();
$cat = new \Animal\Cat();

echo 'END <br>';


运行结果:


不同命名空间的类 不同路径的类文件

如/Logic/Activity/ActivityOne.class.php文件 与 /Animal/Dog.class.php文件,目录如下:

/Logic/Activity/ActivityOne.class.php文件内容如下:
<?php
namespace Logic\Activity;
class ActivityOne
{
    function __destruct()
    {
        echo 'This is a ActivityOne Class!\Logic\Activity\ActivityOne.class.php<br>';
    }
}


/index.php文件内容如下:
<?php
//自动加载
spl_autoload_register(function ($class_name) {
    $class_name = str_replace('\\', '/', $class_name);
    $file_name  = $class_name . '.class.php';
    if (file_exists($file_name)) {
        require_once $file_name;
    }
});
use Animal\Dog;
use Logic\Activity\ActivityOne;

$dog = new Dog();
$A   = new ActivityOne();


运行结果:


注意

    1.命名空间与文件路劲的对应关系:如use Animal\Dog; Dog类的存放路径必须是在Animal文件夹中,否则引入文件是会报错找不到文件。
    2.类文件的后缀名必须统一:如以’.class.php'结尾




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值