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

php面向对象——类的自动加载

2020-06-29 04:51 876 查看

手动加载 link

  • include ; include_once
  • require ; require_once
  • include 和 require 除了处理错误的方式不同之外,在其他方面都是相同的
  • require 如果引入的文件不存在,生成一个致命错误,在错误发生后脚本会停止执行
  • include 如果引入的文件不存在,生成一个警告,在错误发生后脚本会继续执行
  • _once 的作用:只引入1次,如果之前已经引用过,不再重复引用
include("./sub.php");       // 就相当于把 sub.php 里的代码替换到这里
t();

// include_once     // 相同文件仅能引入一次

include_once ("./sub.php");       // 就相当于把 sub.php 里的代码替换到这里
include_once ("./sub.php");       // 无效
t();

自动加载的意义

  • 开发中,一个类对应一个文件,其命名方式为 类名.class.php
  • 如果一个文件中使用很多个类,手动加载很麻烦,并且灵活性差,不利于维护

类的自动加载

__autoload 尝试加载未定义的类

  • 使用一个未定义的类时,系统会自动调用__autoload函数
  • 需要某个类时加载,不需要时永远不会加载
/*
@function 完成类的自带加载
@param: $class_name 是类的名称
@说明:当程序员使用一个未定义的类时,系统会自动调用__autoload函数,该函数时系统提供的
*/
function __autoload($class_name){
echo $class_name;
require '../'.$Cat.'.php';
}

$cat = new Cat();

__autoload 加载不同文件夹下的类

  • 上面的代码将自动加载路径写死了,要加载不同路径的类怎么办?
  • 新建一个common.php文件,将类名和路径的映射关系用数组定义好
// 新建一个common.php文件,将类名和路径的映射关系用数组定义好

require './common.php';

/*
$class_map = array(
'Dog' => './Dog.class.php',
'Cat' => './Cat.class.php',
'Pig' => './model/Pig.class.php'
)
*/

// __autoload函数是系统提供的
function __autoload($class_name){
global $class_map;	// 声明使用全局变量  作用域问题
require $class_map[$class_name];
}

spl_autoload_register() 以更加灵活的方式来实现类的自动加载

  • 与__autoload的区别就是,可以灵活的注册你自己的自动加载函数
  • 不再建议使用 __autoload() 函数,在以后的版本中它可能被弃用
require './common.php';

/*
$class_map = array(
'Dog' => './Dog.class.php',
'Cat' => './Cat.class.php',
'Pig' => './model/Pig.class.php'
)
*/

// spl_autoload_register() 可以灵活的注册你自己的自动加载类,这里注册之后my_autoload函数才会自动调用
spl_autoload_register('my_autoload');

// my_autoload函数是用户自定义的
function my_autoload($class_name){
global $class_map;
require $class_map[$class_name];
}

思考问题

function __autoload($class_name){
echo $class_name;
// require '../'.$Cat.'.php';
class Cat{
public function say(){
echo '喵喵喵';
}
}
}
$cat = new Cat();
$cat->say();

问题1:类不是在函数内声明的吗?为何在函数外部可以调用?
-------类声明是全局有效的,不管是在多深的函数下声明的类
问题2:函数内部竟然也可以写类?
-------函数内部可以写任何合法的php代码,包括再声明一个函数类
问题3:函数需要调用才会执行内部代码!
-------这里未写调用是因为使用一个未定义的类时,__autoload函数会自动被调用,调用后内部的类才会声明
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: