类的加载(autoload 自动加载)|学习笔记

简介: 快速学习类的加载(autoload 自动加载)

开发者学堂课程【PHP 进阶教程-由浅入深掌握面向对象开发-第一阶段类的加载(autoload 自动加载)】学习笔记,与课程紧密联系,让用户快速学习知识。  

课程地址:https://developer.aliyun.com/learning/course/711/detail/12671


类的加载(autoload 自动加载)

 

主要内容

一、自动加载示例

 

一、自动加载示例

自动加载:PHP 没有那么智能的系统自动加载,所谓自动加载只是 PHP 提供了一种加载机制:即实现定义一个函数__autoload(), 然后当系统需要使用类,而内存中又不存在的时候,系统就会自动调用__autoload()函数来加载类文件。

#自动加载机制:利用系统提供的__autoload()函数

function __autoload($classname){  #参数为类名:即当前需要访问的类的名字

#需要人为定义去哪加载,怎么加载

include_ once $classname .'.php';  #假定为当前目录下,类文件名字为:类名.php

}

#使用类:内存目前并没有

$s = new saler();#系统发现内存没有 Saler,所以调用__autoload()去加载

<?php

#__autoload实现自动加载

#使用类

$b = new Buyer();

image.png

报错,因为没有这个类。使用自动加载解决这个问题。

#自动加载

function__autoload(){

}

image.png

报错,这个函数必须有一个参数,按照要求来,给个参数$a,

#自动加载

function__autoload($a){

}

image.png

这个东西已经过期了,不建议使用,先放着,因为这不致命,但问题是它没有加载到类 Buyer。所以要在里面实现类的加载,

#实现类的加载

include ' Buyer.php';

image.png

可以了。

此时如果还想$s new Saler(),这段代码又不能用了,

image.png

不是类没有,而是没有找到,因为写 include Buyer.php,而且不能重定义 Buyer,因为已经存在了,所以这时要看$a,

echo $a;

image.png

原来在前面 Buyer 类实例化的时候叫 Buyer,Salar 类实例化的时候叫 salar,这个代表类名,类名确定文件关联关系,所以此时就要知道怎么合理运用它,有参数的要求。

#echo $a;      #形参代表类名

#实现类的加载

#include ' Buyer.php' ;

#动态加载

include $a .php ';

image.png

抛开这个问题,两个都成功了,所以它就实现了自动加载。有1000个可以用它,有1万个也可以用它,所以自动加载带来的是效率问题。

用 once 可以保证它的安全,但是正常还是应该这么写,合理的逻辑,

$file = $a.'php' ;

if( !class_ exists($file))  

include $a‘.php';

不存在就加载,存在就没关系,实现一下,

image.png

效果是一样的,只是$s2 = new Saler();不会报错,

image.png

这是安全性的一个处理。

4、一个系统里,可能类文件会放到不同的路径下,有很多的路径,有很多的文件,因为要把类进行分类、再分类,看到底属于什么样的业务范畴,因此一个完整的自动加载函数,应该要进行文件判定以及加载功能

#定义自动加载

function__autoload($classname){

#组织文件路径:假设当前路径下,有两个文件夹下都有类 c 和 m

$c_ file = 'c/'.$classname .' . php' ;      #如 c/saler. php

if(!file_ exists($c_ file)){

include_ once $c_ file;

return true;

}

#说明 c 文件夹没有对应的文件

$m file = 'm/' .$classname .' . php' ; #如 m/Saler . php

if(!file_ exists($m_ file)){

include_ once Sm_ file;

return true;

}

}

传的依然只是一个类名,但是有可能这个文件在 c 目录下面,比如当前目录下面的  c/saler. php,还有可能在 m 目录下面,先判定 C 文件是否存在,存在的话,发 exists,自然是什么都不做的,如果是不存在这个文件,加载一下,然后返回一个 true,不返回也行,因为基本上不会出现同名文件,有了 return true 能够让效率更高,下面代码自动终止。同样,如果还有其他的,就判定其他的目录,如果有十个目录,就写十个这样的代码去判定它,保证能加载到,这样哪个文件夹里面都可以自动加载,所以整个项目都可以实现自动加载,这就是自动加载机制。

注意:自动加载并不是真正的能够自动的加载代码,而是它有自动触发的机制,要去寻找对应的文件实现包含,必须要自己把它写好,而且如果写好的代码因为人为的犯错,发现这个类不存在或者类名出现错误,那么这时它报的错它也不负责处理,因为这是开发者自己犯的错,系统不能规避。定义了一个 s 类,非要访问一个 a 类,这就是跟系统过不去,所以这种方法要用一定是自己去处理好内部的逻辑,保证能够加载到,同时不出错,这就是实现自动加载最基本的事情。

以上的方式,是使用__autoload(),也就是默认提供的系统函数魔术函数来实现的,但是这种方式系统已经不建议使用了,因为现在的版本是在 PHP 以上,所以他不建议使用,应该用 spl__autoload register() instead 替换。

image.png

相关文章
|
SQL 关系型数据库 MySQL
使用OceanBase进行大规模数据迁移的最佳实践
【8月更文第31天】随着业务的不断扩展,数据迁移成为了企业日常运营中不可避免的任务之一。对于那些正在从传统的数据库系统向分布式数据库系统过渡的企业来说,数据迁移尤为重要。OceanBase 是一个由阿里巴巴集团开发的高性能分布式关系数据库,它以其高可用性、水平扩展能力和成本效益而闻名。本文将探讨如何使用 OceanBase 进行大规模数据迁移,并提供相关的最佳实践和代码示例。
1076 1
|
机器学习/深度学习 人工智能 安全
AI 绘画Stable Diffusion 研究(三)sd模型种类介绍及安装使用详解(1)
AI 绘画Stable Diffusion 研究(三)sd模型种类介绍及安装使用详解
3103 0
|
监控 安全 算法
在Linux中,cpu使用率过高可能是什么原因引起的?排查思路是什么?
在Linux中,cpu使用率过高可能是什么原因引起的?排查思路是什么?
|
SQL 存储 关系型数据库
深入 MySQL 的执行计划与性能优化
深入 MySQL 的执行计划与性能优化
220 0
|
开发框架 安全 .NET
文件上传漏洞技术总结
该文总结了文件上传技术相关的漏洞和绕过方法,包括语言可解析的后缀(如phtml、pht)、常见的MIME类型、Windows特性(如大小写、ADS流、特殊字符)、0x00截断技巧(需满足PHP版本和magic_quotes_gpc状态)、POST型0x00截断、文件头检查(通过合成图片马绕过)、二次渲染(利用未修改部分插入恶意代码)以及各种服务器的解析漏洞(Apache的.htaccess、解析漏洞,IIS的目录解析、文件解析、默认解析和IIS 7.x/Nginx的畸形解析)。此外,还提到了Java的空字节截断问题。
456 1
文件上传漏洞技术总结
|
前端开发 JavaScript 测试技术
【PHP开发专栏】PHP Web开发基础与流程
【4月更文挑战第29天】本文介绍了PHP Web开发的基础和流程,帮助初学者入门。内容包括Web服务器与PHP解释器的工作原理、HTML/CSS/JavaScript基础知识、PHP语法与数据库操作。开发流程涵盖项目规划、环境搭建、数据库设计、代码编写、测试与调试,以及部署与维护。此外,文中还强调了使用框架、代码组织、安全性及性能优化等进阶知识和最佳实践,旨在培养优秀PHP开发者。
298 0
|
运维 自然语言处理 开发工具
【专栏】NeoVim正逐渐取代Vim成为运维人员首选的文本编辑器。这 8 个原因或许是答案,命令对比一目了然!
【4月更文挑战第28天】NeoVim正逐渐取代Vim成为运维人员首选的文本编辑器。其优势包括更好的扩展性、现代化界面、多语言编程支持、异步处理能力、协作功能、持续更新及活跃社区。NeoVim的命令与Vim相似,但在启动配置、插件管理和窗口管理等方面有所优化。总的来说,NeoVim提供了更强大、灵活和现代的编辑体验。
1277 0
|
NoSQL PHP Redis
PHP使用Redis的Hash(哈希表)命令
本篇笔记简单介绍了Redis的Hash(哈希表)命令:hDel,hExists,hGet,hGetAll,hIncrBy,hIncrByFloat,hKeys,hLen,hMGet,hMSet,hSet,HSetnx,hVals作用和php的使用
3496 0
|
SQL 关系型数据库 MySQL
[网络安全]sqli-labs Less-7 解题详析
[网络安全]sqli-labs Less-7 解题详析
383 0
|
Web App开发 Linux 网络安全