首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

PHP的类自动加载机制

PHP的类自动加载机制 在PHP开发过程中,如果希望从外部引入一个class,通常会使用include和require方法,去把定义这个class的文件包含进来。...在PHP5之前,各个PHP框架如果要实现类的自动加载,一般都是按照某种约定自己实现一个遍历目录,自动加载所有符合约定规则的文件的类或函数。...当然,PHP5之前对面向对象的支持并不是太好,类的使用也没有现在频繁。 在PHP5后,当加载PHP类时,如果类所在文件没有被包含进来,或者类名出错,Zend引擎会自动调用__autoload 函数。...(在我们的例子是最简单的情况,类与调用它们的PHP程序文件在同一个文件夹下),第三件事是将类从磁盘文件中加载到系统中。...,另外一个是加载器不能找到这个类时是否抛出异常的标志。

80720

PHP中类的自动加载

PHP中类的自动加载 在之前,我们已经学习过Composer自动加载的原理,其实就是利用了PHP中的类自动加载的特性。在文末有该系列文章的链接。...PHP中类的自动加载主要依靠的是__autoload()和spl_autoload_register()这两个方法。今天我们就来简单的看一下这两个方法的使用。...我们在__autoload()方法中只需要去include这个类所在的文件即可。 spl_autoload_register() 这个方法目前已经替代了上述魔术方法自动加载类的功能。...它是spl扩展库中的一个方法,spl扩展库现在已经默认集成在了PHP中,大家可以放心地直接使用。...所以并不需要关心会有类文件重复加载的问题。而且在大型框架中使用composer的时候会加载非常多的类,_once方法也会带来效率的问题。

1.3K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    面试官:谈谈类加载器吧,你有没有看过类加载器的源码?

    一、类加载 1.1、在java代码中,类型的加载,连接,初始化过程都是在程序运行期间完成的。 图示: 1.2、类型的加载——这里的类型是指的什么?...(类加载器) 1.5、类加载的分类以及各种加载职责以及层级结构 (1)系统级别 1)启动类加载器 2)扩展类加载器 3)系统类加载器(App类加载器) (2)用户级别的 自定义类加载器(...借助双亲委派模型,我们java核心类库的类必须是由我们的启动类加载器加载的,这样可以确保我们核心类库只会在jvm中存在一份这就不会给自定义类加载器去加载我们核心类库的类。...类加载器的命名空间 (1)类加载器的全盘委托机制:比如我们的Person类是由我们的AClassLoader进行加载的,那么我们Person引用的Dog类就会委托给我们的A ClassLoader进行加载...8、验证子加载器加载出来的类可以访问父加载器加载的类 测试环境:我们的Person是由我们的自定义类加载器(把classpath下的Person.class删除,并且把Person.class copy

    91320

    不重启JVM,替换掉已经加载的类,偷天换日?

    Java的对象行为(方法、函数)是存储在方法区的。 “方法区中的数据从哪来?” “方法区中的数据是类加载时从class文件中提取出来的。” “class文件从哪来?”...“从Java或者其他符合JVM规范的源代码中编译而来。” “源代码从哪来?” “废话,当然是手写!” “倒着推,手写没问题,编译没问题,至于加载……有没有办法加载一个已经加载过的类呢?...如果有的话,我们就能修改字节码中目标方法所在的区域,然后重新加载这个类,这样方法区中的对象行为(方法)就被改变了,而且不改变对象的属性,也不影响已经存在对象的状态,那么就可以搞定这个问题了。...我们能做的基本上也就是简单修改方法内的一些行为,这对于我们开头的问题,打印一段日志来说,已经足够了。...考虑到性价比,我们也不可能在每个工程中都开发一段专门做这些修改字节码、重新加载字节码的代码。 如果JVM不在本地,在远程呢? 如果连ASM都不会用呢?能不能更通用一些,更“傻瓜”一些。

    39510

    不重启JVM,替换掉已经加载的类,偷天换日?

    Java的对象行为(方法、函数)是存储在方法区的。 “方法区中的数据从哪来?” “方法区中的数据是类加载时从class文件中提取出来的。” “class文件从哪来?”...“从Java或者其他符合JVM规范的源代码中编译而来。” “源代码从哪来?” “废话,当然是手写!” “倒着推,手写没问题,编译没问题,至于加载……有没有办法加载一个已经加载过的类呢?...如果有的话,我们就能修改字节码中目标方法所在的区域,然后重新加载这个类,这样方法区中的对象行为(方法)就被改变了,而且不改变对象的属性,也不影响已经存在对象的状态,那么就可以搞定这个问题了。...我们能做的基本上也就是简单修改方法内的一些行为,这对于我们开头的问题,打印一段日志来说,已经足够了。...考虑到性价比,我们也不可能在每个工程中都开发一段专门做这些修改字节码、重新加载字节码的代码。 2、如果JVM不在本地,在远程呢? 3、如果连ASM都不会用呢?能不能更通用一些,更“傻瓜”一些。

    1K10

    【Android 逆向】类加载器 ClassLoader ( 启动类加载器 | 扩展类加载器 | 应用类加载器 | 类加载的双亲委托机制 )

    , Extention ClassLoader 加载额外的 /lib/ext 类库 , Application ClassLoader 加载开发者自己开发的类库 ; 加载完 开发者 开发的类库 后 ,...类加载任务 之后 , 也会 委托 父类的父类 类加载器 执行 ; 委托操作 , 会一直传递到 最顶层的 启动类加载器 Bootstrap ClassLoader ; 如果 启动类加载器 Bootstrap...; 同理 , 父类 委托 给子类的 类加载任务 , 如果 子类类加载器 可以完成加载 , 成功返回 , 如果子类类加载器无法完成加载 , 就再次 将 类加载任务 委托给 子类的子类 , 继续向下传递 ;..., 如果也无法加载 , 儿子再交给孙子去做 ; 双亲委派模式优点 : 避免了类重复加载 : 如果某 Class 类已经加载过了 , 通过该机制 , 可以 直接读取出已经加载的类 ; 安全性强 : 系统类...无法 被替代 , 系统类只能由 启动类加载器 Bootstrap ClassLoader 加载 , 应用类加载器 加载被篡改的 Java 核心类是无效的 ;

    89130

    类加载器 超详解:什么是类加载器,类加载器作用及应用场景,类加载时机,类加载的完整过程,类加载器分类

    文章目录一、什么是类加载器、类加载器作用1.1 定义与作用1.2 应用场景二、类加载时机三、类加载的完整过程3.1 加载3.2 验证3.3 准备3.4 解析3.5 初始化3.6 使用3.7 小节四、类加载的分类...作为方法区这个类的各种数据的访问入口3.2 验证确保Class文件字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身安全(文件中的信息是否符合虚拟机规范有没有安全隐患)。...代码中,无法通过Java代码获取底层的虚拟机启动类加载器)在Arthas中可以通过sc -d 类名的方式查看加载这个类的类加载器详细的信息,如通过上图可以看到,java.lang.String类的类加载器是空的...路径中要包含原来ext文件夹,同时在最后加上扩展的路径。应用程序类加载器应用程序类加载器会加载classpath下的类文件,默认加载的是项目中的类以及通过maven引入的第三方jar包中的类。...(5)JVM为什么采用双亲委派机制通过双亲委派机制可以避免某一个类被重复加载,当父类已经加载后则无需重复加载,保证唯一性。

    11910

    类的加载

    概念 类加载 加载:将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后生成一个代表这个类的java.lang.Class对象 链接:将Java类的二进制代码合并到...JVM的运行状态之中的过程 验证:确保加载的类信息符合JVM规范,没有安全方面的问题 准备:正式为类变量(static)分配内存并设置类变量默认初始化值的阶段,这些内存都将在方法区中进行分配 解析:虚拟机常量池的符号引用...(类构造器是构造类的信息的,不是构造该类对象的构造器) 当初始化一个类的时候,如果发现其父类还没有初始化,则需要先触发其父类的初始化 虚拟机会保证一个类的()方法在多线程环境中被正确加锁和同步 什么时候会发生类的初始化...比如:当通过子类引用父类的静态变量,不会导致子类初始化 通过数组定义类引用,不会触发此类的初始化 引用常量不会触动此类的初始化(常量在链接阶段就存入调用类的常量池中了) 类加载的作用 将class文件字节码内容加载到内存中...类缓存 标准的JavaSE类加载起器可以按要求查找类,但一旦某个类被加载到类加载器中,它将维持加载(缓存)一段时间。

    28810

    java类的加载过程和类加载器的分析

    记得第一次遇见这个问题的时候,同学给我的回答是: 1.虚拟机会加载JDK里类的核心包 2.虚拟机会加载JDK里类的扩展包 3.虚拟机会加载JDK里类的系统包 4.虚拟机再会加载我们写好的java类。...再次之前我想补充一个名词解释,类加载器:虚拟机把  实现 类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流” 这个过程的代码称为类加载器 1....加载 加载只是类加载过程的一个阶段而已,但往往被大家弄成了这就是类的加载过程,所以才有了博文开头时同学给我的那个回答; 希望大家不要混淆出这个很相似的名词,从而对类加载有所误读。...()方法来进行加载; 结合第一步加载可以这么理解,  1.首先要启动→   启动类加载器,这时会调用启动类加载器的父加载器,但由于启动类加载器时所有类的父加载器, 所以其父加载器为空(相当于Object...在准备阶段,已经为变量赋过一次系统要求的初始值,到了初始化阶段会根据程序员的要求出初始化变量赋值。

    1.5K80

    java类加载的过程 父_类加载机制原理

    其中,加载(Loading)就是把类的.class文件读入Java虚拟机中; 而连接(Linking)就是把这种已经读入虚拟机的二进制形式的类型数据合并到虚拟机的运行时状态中去 。...除此之外,所有引用类的方式都不会触发初始化, 称为被动引用。 类的加载 加载是类加载过程的一个阶段,这两个概念一定不要混淆。...如果所运行的全部代码(包括自己编写的以及第三方包中的代码)都已经被反复使用和验证过 , 那么在实施阶段就可以考虑使用一Xverify;none 参数来关闭大部分的验证措施, 以缩短虚拟机类加载的时间。...如果有了直接引用, 那引用的目标必定已经在内存中存在 类的初始化 初始化阶段是类加载过程的最后一步 , 前面的几个阶段, 除了在加载阶段用户应用程序可以通过自定 义类加载器參与之外, 其余动作完全由虚拟机主导和控制...方法与类的构造函数 (或者说实例构造器()方法)不同,它不需要显式地调用父类构造器, 虚期机会保证在子类的()方法执行之前, 父类的()方法已经执行完毕, 因此在虚期机中第一个被执行的

    71520

    java类的加载过程和类加载器的分析

    记得第一次遇见这个问题的时候,同学给我的回答是: 1.虚拟机会加载JDK里类的核心包 2.虚拟机会加载JDK里类的扩展包 3.虚拟机会加载JDK里类的系统包 4.虚拟机再会加载我们写好的java类。...再次之前我想补充一个名词解释,类加载器:虚拟机把  实现 类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流” 这个过程的代码称为类加载器 1....加载 加载只是类加载过程的一个阶段而已,但往往被大家弄成了这就是类的加载过程,所以才有了博文开头时同学给我的那个回答; 希望大家不要混淆出这个很相似的名词,从而对类加载有所误读。...是所有类的父类,这种感脚~),然后它就会调用自己的findClass方法来自启动加载 ; 2.标准扩展类加载器启动时就会借助其父类 启动类加载器 作为父加载器 来启动了; 3.系统类加载器启动时就会借助其父类...在准备阶段,已经为变量赋过一次系统要求的初始值,到了初始化阶段会根据程序员的要求出初始化变量赋值。

    60350

    jvm的类加载器(classloader)及类的加载过程

    什么叫类加载(classloader)? 类加载简单的说就是JVM通过类加载器ClassLoader,把.class文件中的信息,拼装成Class对象放入内存中。...区别于符合引用就是直接引用必须引用的目标已经在内存中存在。...此外类加载还采用了cache机制,也就是如果 cache中保存了这个Class就直接返回它,如果没有才从文件中读取和转换成Class,并存入cache,这就是为什么我们修改了Class但是必须重新启动JVM...即在类加载的时候,系统会判断当前类是否已经被加载,如果已经被加载,就会直接返回可用的类,否则就会尝试加载,在尝试加载时,会先请求双亲处理,如果双亲请求失败,则会自己加载。...//将加载过这个类对象直接返回 return c; } 双亲委托模型好处与弊端 好处: 避免重复加载:当父亲已经加载了该类,就没有必要ClassLoader再加载一次; 安全:避免自定义的类名与原生一致导致替代

    1.9K21

    类加载器的方法_JS加载器

    加载相同的类名 则加载的是同一个类,c1 c2是同一个类,由于已经初始化过 创建对象不再初始化 不再打印 "UserImpl init ..." // System.out.println...==c2); // true 同一个类加载器器,加载同名的类,第一次加载时加载的类会缓存到类加载器的缓存,再次加载直接在缓存读取,两次加载的是同一个类 //直接获取类的类加载器...} } 在应用程序中,默认我们获取上下文类加载器、类型对象getClassLoader都是采用的同一个应用程序类加载器,类在第一次被加载后会缓存到类加载器的缓存中,由于是同一个类加载器此时同名的类不能被多次加载...,且应用程序类加载器只能加载classpath下的类。...如果我们想加载自定义路径下的类,需要用到自定义类加载器,可以去指定路径下加载类,且通过创建多个类加载器对象,加载的同名类相互隔离,也就是说同名类可以被多个自定义类加载器对象加载。

    5.9K10

    类加载器加载Class文件的过程

    类加载器加载Class文件的过程 jdk8和9有一些区别,这里以8为准,9作为最后的扩充 类加载器是用于加载class文件的,我们从这里开始介绍 前言 因为底层硬件的不同,如果在不同硬件上都要做一次适配化无疑是令人奔溃的...java的类文件或者文件已经损坏,无法进行加载。...其他流程顺序是固定的 接下来分别探究每一个过程分别做了什么 加载 1.根据类的全类名来获取定义此类的二进制字节流。...之外,所有的类都应当有父类就是这里验证的 字节码验证 保证不会出现类似于“在操作 栈放置了一个int类型的数据,使用时却按long类型来加载入本地变量表中”这样的情况。...因为BootstrapClassLoader是通过C/C++实现的,不存在JVM体系中所以输出为null, 类加载器具有登记制度但是并没有继承关系,以组合的方式复用父加载器的功能 附加 JDK9中用平台加载器替代了扩展加载器的功能

    1.2K20
    领券