PHP-自动加载类

1.2 自动加载类

在项目开发中,因为一个文件中只能写一个类,并且在执行过程中会有很多的类参与,如果一个一个的加载很麻烦,所以,就需要一个机制实现在PHP执行过程中自动加载需要的类。

1.2.1 类的规则

  1. 一个文件中只能放一个类(必须)
  2. 文件名和类名同名(必须)
  3. 类文件以.class.php结尾(不是必须)

1.2.2 手动加载类

1、创建Goods.class.php页面

<?php
//商品类
abstract class Goods {
	protected $name;
	final public function setName($name) {
		$this->name=$name;	
	}
	public abstract function getName();
}

2、创建Book.class.php页面

<?php
//图书类
class Book extends Goods {
	public function getName() {
		echo "《{$this->name}》<br>";
	}
}

3、创建Phone.class.php页面

<?php
//电话类
class Phone extends Goods {
	public function getName() {
		echo $this->name,'<br>';
	}
}

4、在PHP页面上加载类文件

<?php
require './Goods.class.php';    //手动加载类文件
require './Book.class.php';		//手动加载类文件
require './Phone.class.php';	//手动加载类文件
//测试
$book=new Book();
$book->setName('面向对象编程');
$phone=new Phone();
$phone->setName('苹果6s');
$book->getName();
$phone->getName();

运行结果

在这里插入图片描述

1.2.3 自动加载类

当缺少类的时候自动的调用__autoload()函数,并且将缺少的类名作为参数传递给__autoload()

<?php
/*
*作用:自动加载类
*@param $class_name string 缺少的类名
*/
function __autoload($class_name) {
	require "./{$class_name}.class.php";
}
//测试
$book=new Book();
$book->setName('面向对象编程');
$phone=new Phone();
$phone->setName('苹果6s');
$book->getName();
$phone->getName();

注意:__autoload()函数在PHP7.2以后就不支持了。

1.2.4 注册加载类

通过spl_autoload_register()注册__autoload()函数

<?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('面向对象编程');
$phone=new Phone();
$phone->setName('苹果6s');
$book->getName();
$phone->getName();

1、spl_autoload_register()可以注册多个自动加载函数

<?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');

2、PHP5.1以后就开始支持此函数。

1.2.5 类文件存储不规则的加载方法

将类名和文件地址做一个映射,组成一个关联数组。

$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'	=>	'./aa/Goods.class.php',
		'Book'	=>	'./bb/Book.class.php',
		'Phone'	=>	'./cc/Phone.class.php'
	);
	//在映射数组中找到就包含
	if(isset($map[$class_name]))
		require $map[$class_name];
});
//测试
$book=new Book();
$book->setName('面向对象编程');
$phone=new Phone();
$phone->setName('苹果6s');
$book->getName();
$phone->getName();

在项目中,绝大部分都是规则存储的,不规则的比较少。

发布了1919 篇原创文章 · 获赞 2038 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/weixin_42528266/article/details/105140226