PHP8新特性:JIT

PHP8新特性:JIT(Just-In-Time) 一、JIT(Just-In-Time)编译技术概述 1.1 什么是JIT编译 JIT(Just-In-Time)编译是一种动态编译技术,它在程序运行时将字节码或中间代码编译为机器码执行,而不是预先编译(AOT,Ahead-Of-Time)或纯粹解释执行。PHP 8.0首次引入了JIT编译器,这是PHP性能演进史上的重要里程碑。 1.2 PHP执行模式的演进 解释执行模式(PHP 5.x及之前): 每次请求都需要解析、编译和执行 无任何形式的持久化缓存 OPCache缓存模式(PHP 5.5+): 缓存预编译的opcode 减少重复编译开销 但仍需解释执行opcode JIT编译模式(PHP 8.0+): 将热代码(频繁执行的代码)编译为机器码 直接执行机器码,绕过解释器 1.3 JIT带来的性能提升 根据官方基准测试,JIT在某些计算密集型工作负载上可带来: 数学运算:1.5-3倍提升 字符串处理:1.2-2倍提升 框架综合性能:10-30%提升 注意:JIT对I/O密集型应用(如纯数据库CRUD)提升有限 二、PHP JIT工作原理 2.1 PHP脚本执行流程 PHP源代码 ↓ Zend编译器 (生成opcode) ↓ OPCache (缓存opcode) ↓ Zend VM解释执行 ↓ JIT编译器 (追踪热代码) ↓ 生成机器码 ↓ 直接执行机器码 2.2 JIT编译流程 代码追踪: 监控执行过程中的热代码(频繁执行的代码路径) 默认阈值:执行次数超过3次触发JIT编译 编译优化: 寄存器分配 循环优化 死代码消除 内联函数调用 机器码生成: 针对当前CPU架构生成优化后的机器码 支持x86和ARM架构 执行切换: 后续执行直接跳转到机器码 绕过Zend虚拟机解释器 2.3 JIT与OPCache的关系 协同工作: OPCache是JIT的基础 JIT只编译OPCache中缓存的opcode 内存管理: JIT使用OPCache的共享内存存储机器码 opcache....

June 22, 2025 · 2 min · Leanku

PHP底层原理与性能优化深度解析

PHP底层原理与性能优化深度解析 一、PHP生命周期与SAPI PHP的生命周期是一个复杂但有序的过程,理解它对于性能优化至关重要。 1.1 PHP生命周期概述 PHP的生命周期可以概括为以下几个阶段: 模块初始化阶段 (MINIT) 只在PHP启动时执行一次 注册常量、类、资源类型等 所有扩展的MINIT方法被调用 请求初始化阶段 (RINIT) 每个请求开始时执行 初始化脚本运行环境 所有扩展的RINIT方法被调用 脚本执行阶段 解析、编译、执行PHP脚本 生成响应内容 请求关闭阶段 (RSHUTDOWN) 每个请求结束时执行 清理请求级资源 所有扩展的RSHUTDOWN方法被调用 模块关闭阶段 (MSHUTDOWN) PHP关闭时执行一次 清理持久化资源 所有扩展的MSHUTDOWN方法被调用 1.2 SAPI (Server API) SAPI是PHP与外部环境交互的接口层,常见的SAPI类型包括: Web服务器集成: Apache (mod_php) Nginx (PHP-FPM) IIS 命令行接口: CLI (Command Line Interface) CGI 嵌入式PHP: 嵌入到其他应用程序中 不同的SAPI实现会影响PHP的生命周期。例如: 在mod_php中,PHP作为Apache模块运行,生命周期与Apache进程绑定 在PHP-FPM中,PHP作为独立的FastCGI进程运行,可以独立管理进程池 二、OPCache原理与优化 2.1 PHP脚本执行流程 传统PHP脚本执行流程: 词法分析 (Lexing) - 将源代码转换为token流 语法分析 (Parsing) - 将token流转换为抽象语法树(AST) 编译 (Compilation) - 将AST转换为opcodes 执行 (Execution) - 执行opcodes 每次请求都需要重复这些步骤,造成大量CPU资源浪费。...

June 22, 2025 · 2 min · Leanku

内存溢出

内存溢出 一、什么是内存溢出 内存溢出(Memory Overflow / Out of Memory, OOM)指程序在申请内存时,没有足够的空间供其使用。在 PHP 中,通常表现为: 脚本超出 memory_limit 设置(默认 128M),抛出 Fatal error: Allowed memory size of X bytes exhausted 系统级 OOM:PHP 进程消耗了操作系统分配的所有内存,被内核强制杀死(常见于常驻进程如 Swoole、Workerman) 二、如何排查内存溢出? 1. 查看错误日志 PHP 错误日志中会直接记录内存耗尽的位置和当前内存使用量。 系统日志(/var/log/messages 或 journalctl -xe)可看到是否因 OOM Killer 杀死了进程。 2. 使用内存分析工具 Xdebug 的追踪功能 xdebug.profiler_enable = 1 xdebug.profiler_output_dir = /tmp 生成 cachegrind 文件,用 QCacheGrind 或 WebGrind 分析,查看哪个函数/行消耗了大量内存。 Xdebug 的垃圾回收统计 xdebug_debug_zstd('your_var'); // 显示变量内存占用(需扩展) 使用 memory_get_usage() / memory_get_peak_usage() 在代码关键位置打印内存,定位峰值点: echo memory_get_usage() . " bytes\n"; // 执行一段代码 echo memory_get_peak_usage() ....

March 28, 2025 · 2 min · Leanku

线程安全

内存溢出 PHP本身(无论是PHP-FPM还是Swoole)并不支持多线程。 线程安全,在PHP的世界里通常指以下两种情况,我们需要分开讨论: PHP解释器自身的线程安全:指PHP作为C语言编写的程序,当其被嵌入到多线程的Web服务器(如Apache的worker MPM)中时,多个线程能否安全地共用一个PHP解释器实例。 PHP应用代码的并发安全:指我们的业务代码在同时处理多个请求时,如何避免共享数据的冲突。这在Swoole这类常驻内存的进程中尤其重要。 下面分别介绍: 1. PHP解释器的线程安全(Zend线程安全,ZTS) 这是PHP源码编译时的一个选项(–enable-zts)。 问题背景:PHP有很多全局变量(例如存放已加载扩展列表的变量)。在单线程环境下没问题,但在多线程环境下,线程A修改这个全局变量时,线程B可能正在读取,导致崩溃。 解决方案(ZTS):PHP通过TSRM(线程安全资源管理器) 为每个线程分配了一个独立的“全局变量副本”。线程A修改自己的副本,不会影响线程B。 对开发者的影响: PHP-FPM(Nginx+PHP-FPM):使用的是多进程模型,一个进程只处理一个请求。进程间内存天然隔离,不存在线程安全问题,因此通常编译非线程安全(NTS) 版本,性能更高。 Apache + worker MPM:Apache使用多线程模型,此时PHP必须编译为ZTS版本才能稳定运行。 Swoole:Swoole本身是多进程模型。每个Worker进程是单线程的,事件循环和协程都在这个主线程中运行。因此,PHP的ZTS在Swoole环境下并非必需,Swoole官网也推荐使用NTS版本的PHP。 小结:对于绝大多数PHP开发者(使用PHP-FPM或Swoole),无需关心PHP底层的ZTS。你基本不会直接编写相关代码,这是扩展开发者和PHP本身需要解决的问题。 2. 应用代码的并发安全:Swoole常驻内存下的挑战 在传统的PHP-FPM中,每个请求结束后,所有变量都被销毁,下一个请求是“干净”的,所以不存在并发安全问题。 但在Swoole中,Worker进程常驻内存,多个协程或请求会并发地操作进程内的同一个全局变量、静态变量或资源(如Redis连接),这就会引发经典的竞态条件(Race Condition)。 典型问题场景: // 一个 Worker 进程内的全局计数器 $globalCounter = 0; // 协程A 和 协程B 同时执行这段代码 $globalCounter++; // 这不是原子操作! echo $globalCounter; 两个协程同时读取0,分别加1,然后写回。你期望输出2,但实际可能输出1。这就是并发问题。 如何保证Swoole下的并发安全? Swoole提供了几种机制来解决这个问题: 方案一:使用原子计数器(Atomic) Swoole提供的Swoole\Atomic是一个基于CPU原子操作的计数器,操作是线程/协程安全的。 $atomic = new Swoole\Atomic(0); // 在任意协程中安全地增加 $atomic->add(); // 无锁,高性能 echo $atomic->get(); 方案二:使用锁(Lock) 对于复杂的共享数据读写(不只是计数),可以使用各种锁。 协程锁(Swoole\Lock 或 Channel):推荐,只在协程级别阻塞。 $lock = new Swoole\Lock(Swoole\Lock::SPIN); // 自旋锁 $lock->lock(); // ....

March 28, 2025 · 1 min · Leanku

PHP中的设计模式

PHP中的设计模式 介绍 设计模式:提供了一种广泛的可重用的方式来解决我们日常编程中常常遇见的问题。设计模式并不一定就是一个类库或者第三方框架,它们更多的表现为一种思想并且广泛地应用在系统中。它们也表现为一种模式或者模板,可以在多个不同的场景下用于解决问题。设计模式可以用于加速开发,并且将很多大的想法或者设计以一种简单地方式实现。当然,虽然设计模式在开发中很有作用,但是千万要避免在不适当的场景误用它们。 分类 按照目的分,目前常见的设计模式主要有23种,根据使用目标的不同可以分为以下三大类: 创建设计模式(Creational Patterns)(5种):用于创建对象时的设计模式。更具体一点,初始化对象流程的设计模式。当程序日益复杂时,需要更加灵活地创建对象,同时减少创建时的依赖。而创建设计模式就是解决此问题的一类设计模式。 单例模式【Singleton】 工厂模式【Factory】 抽象工厂模式【AbstractFactory】 建造者模式【Builder】 原型模式【Prototype】 结构设计模式(Structural Patterns)(7种):用于继承和接口时的设计模式。结构设计模式用于新类的函数方法设计,减少不必要的类定义,减少代码的冗余。 适配器模式【Adapter】 桥接模式【Bridge】 合成模式【Composite】 装饰器模式【Decorator】 门面模式【Facade】 代理模式【Proxy】 享元模式【Flyweight】 行为模式(Behavioral Patterns)(11种):用于方法实现以及对应算法的设计模式,同时也是最复杂的设计模式。行为设计模式不仅仅用于定义类的函数行为,同时也用于不同类之间的协议、通信。 策略模式【Strategy】 模板方法模式【TemplateMethod】 观察者模式【Observer】 迭代器模式【Iterator】 责任链模式【ResponsibilityChain】 命令模式【Command】 备忘录模式【Memento】 状态模式【State】 访问者模式【Visitor】 中介者模式【Mediator】 解释器模式【Interpreter】 按照范围分为:类的设计模式,以及对象设计模式 类的设计模式(Class patterns):用于类的具体实现的设计模式。包含了如何设计和定义类,以及父类和子类的设计模式。 对象设计模式(Object patterns): 用于对象的设计模式。与类的设计模式不同,对象设计模式主要用于运行期对象的状态改变、动态行为变更等。 设计模式原则 设计模式六大原则 开放封闭原则:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。 里氏替换原则:所有引用基类的地方必须能透明地使用其子类的对象. 依赖倒置原则:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。 单一职责原则:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。 接口隔离原则:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。 迪米特法则:一个对象应该对其他对象保持最少的了解。 设计模式实现 1. Singleton(单例模式) 单例模式是最常见的模式之一,在Web应用的开发中,常常用于允许在运行时为某个特定的类创建仅有一个可访问的实例。 <?php final class Mysql { /** * * @var self[该属性用来保存实例] */ private static $instance; /** * * @var mixed */ public $mix; /** * Return self instance[创建一个用来实例化对象的方法] * * @return self */ public static function getInstance() { if (!...

March 15, 2024 · 16 min · Leanku

PHP面向对象

PHP面向对象 面向对象程序设计实际上就是对现实世界的对象进行建模操作。面向对象程序设计的特征主要可以概括为封装、继承和多态 特性 封装 指将对象的属性和方法封装在一起,使得外部无法直接访问和修改对象的内部状态。通过使用访问控制修饰符(public、private、protected)来限制属性和方法的访问权限,从而实现封装 例如,计算机的主机是由内存条、硬盘、风扇等部件组成,生产厂家把这些部件用一个外壳封装起来组成主机,用户在使用该主机时,无需关心其内部的组成及工作原理 继承 指可以创建一个新的类,该类继承了父类的属性和方法,并且可以添加自己的属性和方法。通过继承,可以避免重复编写相似的代码,并且可以实现代码的重用。 例如,已经描述了汽车模型这个类的属性和行为,如果需要描述一个小轿车类,只需让小轿车类继承汽车模型类,然后再描述小轿车类特有的属性和行为,而不必再重复描述一些在汽车模型类中已有的属性和行为 多态 程序中的多态是指一种行为对应着多种不同的实现。指可以使用一个父类类型的变量来引用不同子类类型的对象,从而实现对不同对象的统一操作。多态可以使得代码更加灵活,具有更好的可扩展性和可维护性。 例如,在一般类中说明了一种求几何图形面积的行为,这种行为不具有具体含义,因为它并没有确定具体几何图形;在特殊类(如三角形、正方形、梯形)中都继承了一般类的求面积的行为,可以根据具体的几何图形重新定义求面积行为。 在 PHP 中,多态可以通过实现接口(interface)和使用抽象类(abstract class)来实现。 类与对象 在PHP中把具有相同属性和行为的对象看成同一类,把属于某个类的实例称为某个类的对象。例如学生小千与小锋是两个不同的对象,两者有共同的属性(如学号、成绩等),也有相同的行为(如选课、显示成绩等),因此两者同属于学生类 类 − 定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作。 对象 − 是类的实例。 成员变量 − 定义在类内部的变量。该变量的值对外是不可见的,但是可以通过成员函数访问,在类被实例化为对象后,该变量即可成为对象的属性。 成员函数 − 定义在类的内部,可用于访问对象的数据。 继承 − 继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。 父类 − 一个类被其他类继承,可将该类称为父类,或基类,或超类。 子类 − 一个类继承其他类称为子类,也可称为派生类。 多态 − 多态性是指相同的函数或方法可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。 重载 − 简单说,就是函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。 抽象性 − 抽象性是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体的应用有关。 封装 − 封装是指将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内。 构造函数 − 主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。 析构函数 − 析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做"清理善后" 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。 类定义 类使用 class 关键字后加上类名定义。 类名后的一对大括号({})内可以定义变量和方法。 类的变量使用 var 来声明, 变量也可以初始化值。 函数定义类似 PHP 函数的定义,但函数只能通过该类及其实例化的对象访问。 <?...

March 11, 2024 · 2 min · Leanku

PHP魔术方法

PHP魔术方法 魔术方法是一种特殊的方法,当对对象执行某些操作时会覆盖 PHP 的默认操作。 PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods),这些方法在PHP中充当了举足轻重的作用。 __construct(),类的构造函数。 PHP 允许开发者在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。 __destruct(),类的析构函数。 析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。 __call(),在对象中调用一个不可访问方法时调用。 __callStatic(),用静态方式中调用一个不可访问方法时调用 __get(),获得一个类的成员变量时调用。 读取不可访问(protected 或 private)或不存在的属性的值时,__get() 会被调用 __set(),设置一个类的成员变量时调用。 在给不可访问(protected 或 private)或不存在的属性赋值时,__set() 会被调用。 __isset(),当对不可访问属性调用isset()或empty()时调用。 当对不可访问(protected 或 private)或不存在的属性调用 isset() 或 empty() 时,__isset() 会被调用。 __unset(),当对不可访问属性调用unset()时被调用。 当对不可访问(protected 或 private)或不存在的属性调用 unset() 时,__unset() 会被调用。 __sleep(),执行serialize()时,先会调用这个函数。 __sleep() 方法常用于提交未提交的数据,或类似的清理操作。 __wakeup(),执行unserialize()时,先会调用这个函数。 __wakeup() 经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。 __toString(),类被当成字符串时的回应方法 __invoke(),调用函数的方式调用一个对象时的回应方法 __set_state(),调用var_export()导出类时,此静态方法会被调用。 __clone(),当对象复制完成时调用 __autoload(),尝试加载未定义的类 __debugInfo(),打印所需调试信息 参考文章: PHP: 魔术方法 - Manual

March 10, 2024 · 1 min · Leanku

PHP常见题

PHP常见题 1. 什么事面向对象?主要特征是什么? 面向对象是程序的一种设计方式,它利于提高程序的重用性,使程序结构更加清晰。主要特征:封装、继承、多态。 2. SESSION 与 COOKIE的区别是什么,请从协议,产生的原因与作用说明? A、http无状态协议,不能区分用户是否是从同一个网站上来的,同一个用户请求不同的页面不能看做是同一个用户。 B、SESSION存储在服务器端,COOKIE保存在客户端。Session比较安全,cookie用某些手段可以修改,不安全。 Session依赖于cookie进行传递。禁用cookie后,session不能正常使用。 Session的缺点:保存在服务器端,每次读取都从服务器进行读取,对服务器有资源消耗。Session保存在服务器端的文件或数据库中,默认保存在文件中,文件路径由php配置文件的session.save_path指定。Session文件是公有的。 3. HTTP 状态中302、403、 500代码含义? 一二三四五原则:(即一:消息系列;二:成功系列;三:重定向系列;四:请求错误系列;五:服务器端错误系列。) 302:临时转移成功,请求的内容已转移到新位置 403:禁止访问 500:服务器内部错误 401:代表未授权。 4. 请写出数据类型(int char varchar datetime text)的意思;请问 varchar 和 char有什么区别? Int 整数char 定长字符 Varchar 变长字符 Datetime 日期时间型Text 文本型 Varchar与char的区别 char是固定长度的字符类型,分配多少空间,就占用多长空间。Varchar是可变长度的字符类型,内容有多大就占用多大的空间,能有效节省空间。由于varchar类型是可变的,所以在数据长度改变的时,服务器要进行额外的操作,所以效率比char类型低。 5. MyISAM和 InnoDB 的基本区别?索引结构如何实现? A、MyISAM类型不支持事务,表锁,易产生碎片,要经常优化,读写速度较快,适合用于频繁查询的应用; B、InnoDB类型支持事务,行锁,有崩溃恢复能力,读写速度比MyISAM慢,适合于插入和更新操作比较多的应用,空间占用大,不支持全文索引等。创建索引:alert table tablename add index 索引名 (字段名) 6. isset() 和 empty() 区别 isset判断变量是否存在,可以传入多个变量,若其中一个变量不存在则返回假;empty判断变量是否为空为假,只可传一个变量,如果为空为假则返回真。 7. 请说明 PHP 中传值与传引用的区别。什么时候传值什么时候传引用? 按值传递:函数范围内对值的任何改变在函数外部都会被忽略按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。按引用传递则不需要复制值,对于性能提高很有好处。 8. 在PHP中error_reporting这个函数有什么作用? 设置PHP的报错级别并返回当前级别。 9. 现在编程中经常采取MVC三层结构,请问MVC分别指哪三层,有什么优点? MVC三层分别指:业务模型、视图、控制器,由控制器层调用模型处理数据,然后将数据映射到视图层进行显示,优点是:①可以实现代码的重用性,避免产生代码冗余;②M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式 10. 在程序的开发中,如何提高程序的运行效率? A、优化SQL语句,查询语句中尽量不使用select *,用哪个字段查哪个字段;少用子查询可用表连接代替;少用模糊查询;...

February 20, 2024 · 2 min · Leanku

PHP常用函数整理

PHP常用函数整理 字符串 strlen() 获取字符串长度。(一个汉字长度为3个字符,一个英文字母长度为1个字符) strpos() 在字符串内查找一个字符或一段指定的文本,返回第一次出现的位置或者false stripos() 同上,但不区分大小写 strrpos() 同上上,返回最后一次出现的位置或false strripos() 同上,但不区分大小写 explode() 字符串打散为数组 implode() 数组拼接成字符串 strtoupper() 把字符串转换为大写 strtolower() 把字符串转换为大写 ucfirst() 把单词的首字母转换成大写 lcfirst() 把单词的首字母转换为小写 ucwords() 把字符串中每个单词的首字母转换为大写 str_replace 子字符串替换 str_ireplace str_replace 的忽略大小写版本 strrev 反转字符串 trim 去除字符串首尾处的空白字符(或者其他字符) rtrim 删除字符串末端的空白字符(或者其他字符) substr 截取字符串的一部分,返回字符串的子串 substr 截取字符串的一部分(中文,需要安装扩展mbstring),返回字符串的子串 更多请参考官方文档 数组 array() 创建数组 count() 返回数组中元素的数量 sizeof() 同样效果 array_push() 将一个或多个单元压入数组的末尾(入栈) array_pop() 弹出数组最后一个单元(出栈) array_unshift() 在数组开头插入一个或多个单元 array_shift() 将数组开头的单元移出数组 shuffle() 打乱数组 reset — 将数组的内部指针指向第一个单元 end — 将数组的内部指针指向最后一个单元 current — 返回数组中的当前值 list — 把数组中的值赋给一组变量...

February 18, 2024 · 1 min · Leanku

一些PHP基础的简单整理

一些PHP基础的简单整理 常量 关于常量定义 <?php $a = 1; define("AAA".$a,"AAA"); echo constant("AAA".$a); define() 在运行时定义一个常量。 constant() 返回一个常量的值。当你不知道常量名,却需要获取常量的值时,constant() 就很有用了。也就是说,常量名储存在一个变量里,或者由函数返回时。 const不能在条件语句中定义常量。 const用于类成员变量的定义,define()不可用于类成员变量的定义,可用于全局变量。 const可在类中使用,define不能。 常量和变量的区别 常量前面没有且不能有$符号 常量可以不用理会变量的作用域,在任何地方定义和使用 常量一旦定义就不能重新定义或取消定义 常量的值只能是标量(字符串、整数、浮点数、布尔值),支持数组 获取所有常量 get_defined_constants() get_defined_constants(true) get_defined_constants(true)[‘user’] 魔术常量:它的值随着它在代码中的位置改变而变化 LINE 文件中的当前行号 FILE 文件的完整路径和文件名,包含根目录 DIR 文件所在目录 FUNCTION 该函数被定义时的名字,区分大小写 CLASS 该类被定义时的名字,区分大小写 NAMESPANCE 命名空间 METHOD 命名空间类名方法名 TRAIT 当前使用的trait的名字 包含文件 include和require的区别 include和require除了错误处理的方式不同,其他方面都是相同的。 require生成一个致命错误(E_COMPILE_ERROR),在错误发生后脚本停止运行 include生成一个警告(E_WARNING),在错误发生后脚本继续运行 面向对象(OO) 概念 面向对象是一种编程思想和方法,它将程序中的数据和操作数据的方法封装在一起,形成“对象”,并通过对象之间的交互和消息传递来完成程序的功能。 面向对象编程(OOP)强调数据的封装、继承、多态和动态绑定等特性,使得程序具有更好的可扩展性、可维护性和可重用性。 OOP特性 封装:指将对象的属性和方法封装在一起,使得外部无法直接访问和修改对象的内部状态。通过使用访问控制修饰符(public、private、protected)来限制属性和方法的访问权限,从而实现封装 继承:指可以创建一个新的类该类继承(extends)了父类的属性和方法,并且可以添加自己的属性和方法。通过继承,可以避免重复编写相似的代码,并且可以实现代码的复用。 多态:指可以使用一个父类类型的变量来引用不同子类类型的对象,从而实现对不同对象统一操作。多态可以使得代码更加灵活,具有更好的可扩展性和可维护性。在PHP中多态可通过实现接口(interface)和使用抽象类(abstract class)来实现。 类的访问控制 public(公有):公有的类成员可以在任何地方被调用。 protected(受保护):受保护的类成员可以被其自身以及其子类和父类访问。 private(私有):私有的类成员只能被其定义所在的类访问 构造方法 __construct 构造方法是一种特殊的方法,在创建一个新对象时,它会被自动调用 他可以用来 初始化 对象的属性或执行其他必要的操作 没有返回值 析构函数 __destruct...

February 18, 2024 · 2 min · Leanku