您的位置:首页 > 编程语言 > PHP开发

PHP自动加载 spl_autoload_register

2017-05-07 00:03 826 查看
内容描述:

     刚开始自学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'结尾
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: