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

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

February 20, 2024 · 1 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

PHP的 FPM 和 CLI

PHP的 FPM 和 CLI PHP-FPM PHP-FPM 即 PHP FastCGI 进程管理器。 要了解 PHP-FPM ,首先要看看 CGI 与 FastCGI 的关系。 CGI 的英文全名是 Common Gateway Interface,即通用网关接口,是 Web 服务器调用外部程序时所使用的一种服务端应用的规范。 早期的 Web 通信只是按照客户端请求将保存在 Web 服务器硬盘中的数据转发过去而已,这种情况下客户端每次获取的信息也是同样的内容(即静态请求,比如图片、样式文件、HTML文档),而随着 Web 的发展,Web 所能呈现的内容更加丰富,与用户的交互日益频繁,比如博客、论坛、电商网站、社交网络等。 这个时候仅仅通过静态资源已经无法满足 Web 通信的需求,所以引入 CGI 以便客户端请求能够触发 Web 服务器运行另一个外部程序,客户端所输入的数据也会传给这个外部程序,该程序运行结束后会将生成的 HTML 和其他数据通过 Web 服务器再返回给客户端(即动态请求,比如基于 PHP、Python、Java 实现的应用)。利用 CGI 可以针对用户请求动态返回给客户端各种各样动态变化的信息。 FastCGI 顾名思义,是 CGI 的升级版本,为了提升 CGI 的性能而生,CGI 针对每个 HTTP 请求都会 fork 一个新进程来进行处理(解析配置文件、初始化执行环境、处理请求),然后把这个进程处理完的结果通过 Web 服务器转发给用户,刚刚 fork 的新进程也随之退出,如果下次用户再请求动态资源,那么 Web 服务器又再次 fork 一个新进程,如此周而复始循环往复。 而 FastCGI 则会先 fork 一个 master 进程,解析配置文件,初始化执行环境,然后再 fork 多个 worker 进程(与 Nginx 有点像),当 HTTP 请求过来时,master 进程将其会传递给一个 worker 进程,然后立即可以接受下一个请求,这样就避免了重复的初始化操作,效率自然也就提高了。而且当 worker 进程不够用时,master 进程还可以根据配置预先启动几个 worker 进程等着;当空闲 worker 进程太多时,也会关掉一些,这样不仅提高了性能,还节约了系统资源。 这样一来,PHP-FPM 就好理解了,FastCGI 只是一个协议规范,需要每个语言具体去实现,PHP-FPM 就是 PHP 版本的 FastCGI 协议实现,有了它,就是实现 PHP 脚本与 Web 服务器(通常是 Nginx)之间的通信,同时它也是一个 PHP SAPI,从而构建起 PHP 解释器与 Web 服务器之间的桥梁。 PHP-FPM 负责管理一个进程池来处理来自 Web 服务器的 HTTP 动态请求,在 PHP-FPM 中,master 进程负责与 Web 服务器进行通信,接收 HTTP 请求,再将请求转发给 worker 进程进行处理,worker 进程主要负责动态执行 PHP 代码,处理完成后,将处理结果返回给 Web 服务器,再由 Web 服务器将结果发送给客户端。这就是 PHP-FPM 的基本工作原理。...

February 17, 2024 · 1 min · Leanku

常用算法的PHP实现

常用算法的PHP实现 1. 快速排序 (Quick Sort) <?php function quickSort($arr) { if (count($arr) <= 1) { return $arr; } $pivot = $arr[0]; $left = $right = []; for ($i = 1; $i < count($arr); $i++) { if ($arr[$i] < $pivot) { $left[] = $arr[$i]; } else { $right[] = $arr[$i]; } } return array_merge(quickSort($left), [$pivot], quickSort($right)); } // 测试 $numbers = [64, 34, 25, 12, 22, 11, 90]; echo "原始数组: " . implode(', ', $numbers) ....

March 12, 2023 · 3 min · Leanku

PHP位运算使用

PHP 位运算介绍 位运算符允许对整型数中指定的位进行求值和操作。 以下是官网的一个介绍。 例子 名称 结果 $a & $b And(按位与) 将把 $a 和 $b 中都为 1 的位设为 1。 $a | $b Or(按位或) 将把 $a 和 $b 中任何一个为 1 的位设为 1。 $a ^ $b Xor(按位异或) 将把 $a 和 $b 中一个为 1 另一个为 0 的位设为 1。 ~ $a Not(按位取反) 将 $a 中为 0 的位设为 1,反之亦然。 $a « $b Shift left(左移) 将 $a 中的位向左移动 $b 次(每一次移动都表示 “乘以 2”)。 $a » $b Shift right(右移) 将 $a 中的位向右移动 $b 次(每一次移动都表示 “除以 2”)。 详情请点击这里了解。 平常开发需要用位运算吗? 位运算符都是针对整数的二进制数字形式而进行的。...

February 28, 2023 · 1 min · Leanku