内容描述:
刚开始自学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'结尾