自动加载类
-
概念
- 在项目开发中,因为一个文件中只能写一个类
- 并且在执行过程中会有很多的类参与
- 如果一个一个的加载很麻烦
- 所以,就需要一个机制实现在PHP执行过程中自动加载需要的类
-
类的规则
- 一个文件中只能放一个类(必须)
- 文件名和类名同名(必须)
- 类文件以.class.php结尾(不是必须)
手动加载类
# Goods.class.php
<?php
//商品类
abstract class Goods {
protected $name;
final public function setName($name) {
$this->name=$name;
}
public abstract function getName();
}
?>
# Book.class.php
<?php
//图书类
class Book extends Goods {
public function getName() {
echo "《{$this->name}》<br>";
}
}
?>
# Phone.class.php
<?php
//电话类
class Phone extends Goods {
public function getName() {
echo $this->name,'<br>';
}
}
?>
# index.php
<?php
require './Goods.class.php'; //手动加载类文件
require './Book.class.php'; //手动加载类文件
require './Phone.class.php'; //手动加载类文件
//测试
$book=new Book();
$book->setName('PHP和MySQL Web开发');
$book->getName();
$phone=new Phone();
$phone->setName('华为 荣耀30');
$phone->getName();
?>
自动加载类
- 概念
- 当缺少类的时候自动的调用
__autoload()
函数 - 并且将缺少的类名作为参数传递给
__autoload()
__autoload()
函数在PHP7.2以后就不支持了
- 当缺少类的时候自动的调用
<?php
function __autoload($class_name) {
require "./{$class_name}.class.php";
}
//测试
$book=new Book();
$book->setName('PHP和MySQL Web开发');
$book->getName();
$phone=new Phone();
$phone->setName('华为 荣耀30');
$phone->getName();
?>
注册加载类
- 概念
- 通过
spl_autoload_register()
注册__autoload()
函数 spl_autoload_register()
可以注册多个自动加载函数- PHP5.1以后就开始支持此函数
- 通过
<?php
# 方法一:
/*
//加载类函数
function loadClass($class_name) {
require "./{$class_name}.class.php";
}
//注册加载类函数
spl_autoload_register('loadClass');
*/
# 方法二:
spl_autoload_register(function($class_name){
require "./{$class_name}.class.php";
});
//测试
$book=new Book();
$book->setName('PHP和MySQL Web开发');
$book->getName();
$phone=new Phone();
$phone->setName('华为 荣耀30');
$phone->getName();
?>
<?php
function load1($class) {
require "./{$class}.class.php";
}
function load2($class) {
require "./{$class}.php";
}
function load3($class) {
require "./{$class}.fun.php";
}
spl_autoload_register('load1');
spl_autoload_register('load2');
spl_autoload_register('load3');
?>
类文件存储不规则的加载方法
- 概念
- 将类名和文件地址做一个映射,组成一个关联数组
- 在项目中,绝大部分都是规则存储的,不规则的比较少
$map=array(
//类名 => 类文件地址
'Goods' => './aa/Goods.class.php',
'Book' => './bb/Book.class.php',
'Phone' => './cc/Phone.class.php'
);
<?php
spl_autoload_register(function($class_name){
//类名和文件地址映射成一个关联数组
$map=array(
'Goods' => './Goods.class.php',
'Book' => './Book.class.php',
'Phone' => './Phone.class.php'
);
//在映射数组中找到就包含
if(isset($map[$class_name]))
require $map[$class_name];
});
//测试
$book=new Book();
$book->setName('PHP和MySQL Web开发');
$book->getName();
$phone=new Phone();
$phone->setName('华为 荣耀30');
$phone->getName();
?>