13-面向对象

166 阅读1分钟

类加载机制

类的自定义加载函数:spl_autoload_register() PHP7以下版本,使用__autoload()实现类的自动加载; PHP7以上版本,使用spl_autoload_register()实现类的自动加载。

(1)spl_autoload_register()何时调用?

当试图使用未定义的类时spl_autoload_register自动调用,使用一个类有以下几种情况: ü 使用new关键字创建不存在类的对象时,spl_autoload_register自动调用;例如:$obj = new Student() ü 当使用静态化方式访问一个不存在的类时,spl_autoload_register自动调用,例如:Student::show(); ü 当继承一个不存在的类时,spl_autoload_register自动调用,例如:class Stu extends Parent{} ü 当实现一个不存在的接口时,spl_autoload_register自动调用,例如:class Stu implements Inter

(2)语法格式

ü 描述:将函数注册到SPL(标准PHP库)的__autoload函数队列中。如果该队列中的函数尚未激活,则激活它们。它实际上创建了 autoload 函数的队列,按定义时的顺序逐个执行。 ü 语法:bool spl_autoload_register ([ callback autoloadfunction])u¨参数:autoload_function ] ) ü 参数:autoload_function,欲注册的自动装载函数,可以是匿名函数,也可以是字符串的函数名称。$autoload_function有一个传递过来的类名形参,用于在函数中构建类文件路径。 ü 返回:成功时返回 TRUE, 或者在失败时返回 FALSE。

(3)使用普通函数作为参数


<?php
//类的自动加载:注册类的装载规则
spl_autoload_register("func1");
spl_autoload_register("func2");
function func1($className){
	//构建类文件的路径
	$filename = "./public/$className.class.php";
	//如果类文件存在,则包含
	if(file_exists($filename)) require_once($filename);
}
function func2($className){
	//构建类文件的路径
	$filename = "./libs/$className.cla.php";
	//如果类文件存在,则包含
	if(file_exists($filename)) require_once($filename);
}
//创建学生类对象
$obj1 = new Student();
//创建教师类对象
$obj2 = new Teacher();

(4)使用匿名函数作为参数


<?php
//类的自动加载:注册类的装载规则
spl_autoload_register(function($className){
	//构建所有不同规则类文件路径
	$arr = array(
			"./public/$className.class.php",
			"./libs/$className.cla.php",
		);
	//循环数组
	foreach($arr as $filename)
	{
		//如果类文件存在,则包含
		if(file_exists($filename)) require_once($filename);		
	}
});
//创建学生类对象
$obj1 = new Student();
//创建教师类对象
$obj2 = new Teacher();