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函数会自动被调用,调用后内部的类才会声明
相关文章推荐
- *PHP面向对象:自动加载类
- PHP面向对象之类的自动加载
- php面向对象(OOP)—spl_autoload_register()注册自定义的自动加载函数
- php面向对象 自动加载类 对象串行化 多态的应用
- PHP面向对象_自动加载类__autoload()
- 【PHP面向对象(OOP)编程入门教程】23.自动加载类 __autoload()函数
- php面向对象(四),类自动加载,对象克隆和遍历及序列化反序列化
- php自动加载文件
- [李景山php]每天laravel[002]-自动加载函数流程之bootstrap autoload.php
- PHP 项目实践中的自动加载实现
- PHP的类自动加载机制
- php中ci的session自动加载报错
- 6.Composer实现PHP中类的自动加载
- php自动加载类 __autoload()函数
- PHP自动加载机制
- [PHP] 项目实践中的自动加载实现
- PHP的类自动加载机制
- PHP中的use、命名空间、引入类文件、自动加载类的理解
- 解析PHP入口文件的自动加载功能
- PHP编码规范(PSR-4)-Autoloader 自动加载