PHP的魔术方法

一、介绍

PHP魔术方法是以双下划线__开头的一组特殊方法,用于在对象生命周期、属性访问、方法调用等场景中实现自动化操作。‌简化面向对象编程。

二、17个现有的魔术方法

(一)、对象生命周期相关

1、__construct()

        类的构造函数方法,具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。

2、__destruct()

        类的析构函数,会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。

3、__get()

        读取不可访问(protected 或 private)或不存在的属性的值时,__get() 会被调用。

4、__set()

        在给不可访问(protected 或 private)或不存在的属性赋值时,__set() 会被调用。

5、__isset()

       对不可访问(protected 或 private)或不存在的属性调用 isset() 或 empty() 时,__isset() 会被调用。

6、__unset()

        当对不可访问(protected 或 private)或不存在的属性调用 unset() 时,__unset() 会被调用。

7、__call()

       调用不存在或不可访问(protected 或 private)的方法时调用

8、__callStatic()

        调用不存在或不可访问(protected 或 private)静态方法时调用

9、__clone()

        复制对象时会执行

10、__set_state()

        当调用var_export()导出类时,此方法会被调用。

var_export() 函数返回关于传递给该函数的变量的结构信息,它和 var_dump() 函数类似,不同的是其返回的表示是合法的 PHP 代码。

11、__debugInfo()

        使用print_r,var_dump、print、dump等时调用,可设置打印信息格式

12、__tostring()

         类被当成字符串调用时执行

13、__invoke()

         类被当成方法调用时执执行

14、__sleep()

        serialize()方法被执行前调用

        此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。 如果该方法未返回任何内容,则 null 被序列化,并产生一个 E_NOTICE 级别的错误。

serialize() 函数用于序列化对象或数组,并返回一个字符串。

15、__wakeup()

        unserialize()方法被执行前调用

        经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。

unserialize() 函数用于将通过 serialize()函数序列化后的对象或数组进行反序列化,并返回原始的对象结构。

16、__serialize()   【PHP7.4+之后被引入,当同__sleep()魔术方法同时存在时,__serialize()会被执行,__sleep()会被忽略】

        serialize()方法被执行前调用。

        它必须以一个代表对象序列化形式的 键/值 成对的关联数组形式来返回,如果没有返回数组,将会抛出一个 TypeError 错误。

17、__unserialize() 【PHP7.4+之后被引入,当同__wakeup()魔术方法同时存在时,__unserialize()会被执行,__wakeup()会被忽略】

         unserialize()方法被执行前调用


三、被废弃的魔术方法

18、__autoload() 【PHP 7.2.0 起被废弃,并自 PHP 8.0.0 起被移除

        尝试加载未被定义的类

四、最佳实践与注意事项

  • 避免滥用:

        魔术方法会增加代码隐性逻辑,过度使用会增加代码维护难度。日常编程时推荐优先使用常规 OOP 设计(如公共方法),仅在必要时使用魔术方法。

  • 性能考量:

        动态方法调用(__call/__callStatic)存在额外的函数调用开销,高频场景需谨慎评估。

  • 兼容性:

        部分魔术方法随着php版本的升级,逐步被弃用,如__autoload()。

  • 安全控制:

        在 __get/__set 等方法中,需对输入进行严格过滤,避免代码注入或数据泄露(如动态调用 __call 时验证方法名)。

五、总结


魔术方法是 PHP 面向对象编程中的“约定式钩子”,通过引擎底层的事件机制,将对象行为与生命周期深度绑定。
魔术方法的用意:

  •     解耦:将通用逻辑(如日志、验证)从业务代码中分离。
  •     简洁:用少量代码实现常规需要多个方法才能完成的功能。
  •     灵活:动态拦截对象操作,适应复杂业务场景的动态需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/917674.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/917674.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue2实现类似chatgpt和deepseek的AI对话流打字机效果,实现多模型同时对话

实现多模型同时对话功能特点:1、抽离对话框成单独组件ChatBox.vue,在新增模型对比窗口时可重复利用2、通过sse与后台实时数据流,通过定时器实现打字效果3、适应深度思考内容输出,可点击展开与闭合4、可配置模型参数,本…

电脑上不了网怎么办?【图文详解】wifi有网络但是电脑连不上网?网络设置

一、问题背景 你有没有遇到过这种情况:电脑右下角的网络图标明明显示连接正常,可打开浏览器就是加载不出网页,聊天软件也刷不出新消息? 这种 "网络已连接但无法上网" 的问题特别常见,既不是没插网线&#xf…

思途Spring学习 0804

SpringBoot 核心概念与开发实践SpringBoot 是一个基于 Spring 框架的快速开发脚手架,通过约定大于配置的原则简化了传统 Spring 应用的初始化配置。其核心目标是整合 Spring 生态(如 SSM)并支持微服务架构开发。控制反转(IoC&…

Hutool工具类:Java开发必备神器

Hutool工具类使用说明Hutool是一个Java工具类库,提供了丰富的功能模块,包括字符串处理、日期时间操作、IO流、加密解密、HTTP客户端等。以下是一些常用模块的具体使用方法。字符串工具(StrUtil)字符串处理是开发中的常见需求&…

Node.js中Buffer的用法

// Buffer 与字符串的转换示例 // Buffer 是 Node.js 中用于处理二进制数据的类,字符串与 Buffer 之间的转换是常见操作// 1. 从字节数组创建 Buffer 并转换为字符串 // Buffer.from(array) 接收一个字节数值数组,创建对应的 Buffer let buf_4 Buffer.f…

【Java 基础】Java 源代码加密工具有哪些?

👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主 ⛪️ 个人社区:个人社区 💞 个人主页:个人主页 🙉 专栏地址: ✅ Java 中级 🙉八股文专题:剑指大厂,手撕 J…

es的histogram直方图聚合和terms分组聚合

你提到的这两个 Elasticsearch aggs 聚合语句:第一种:histogram 直方图聚合 "aggs": {"DayDiagram": {"histogram": {"field": "${FiledName}","interval": ${TimeInterval},"extende…

基于Java的AI/机器学习库(Smile、Weka、DeepLearning4J)的实用

基于Java和AI技术处理动漫视频 以下是一些基于Java和AI技术处理动漫视频(如《亚久斗》)的实用案例和实现方法,涵盖视频分析、风格转换、角色识别等方向。每个案例均提供技术思路和关键代码片段。 视频关键帧提取 使用OpenCV提取动漫视频中的关键帧,保存为图片供后续分析…

笔记本电脑联想T14重启后无法识别外置红米屏幕

【原先是可以连接重启后不行】按照以下步骤排查和解决:✅ 1. 基础排查确认连接方式:检查是否使用 USB-C转DP/HDMI线 或 HDMI/DP直连,尝试更换线缆或接口(如换另一个USB-C口或HDMI口)。测试显示器:将红米显示…

vue+ts 基础面试题 (一 )

目录 1.Vue3 响应式原理 一、 响应式的基本概念 二、 核心机制:Proxy 和依赖追踪 三、 触发更新的过程 四、 代码示例 五、 优势总结 2.如何实现组件间通信? 一、父子组件通信 1. 父传子:Props 传递 2. 子传父:自定义事…

Spring AI实战:SpringBoot项目结合Spring AI开发——提示词(Prompt)技术与工程实战详解

🪁🍁 希望本文能给您带来帮助,如果有任何问题,欢迎批评指正!🐅🐾🍁🐥 文章目录一、前言二、提示词前置知识2.1 提示词要素2.2 设计提示词的通用技巧2.2.1 从简单开始2.2.…

【后端】Java static 关键字详解

在 Java 中,static 是一个修饰符,用于定义与类相关(而非对象实例相关)的成员。以下是核心知识点和用法:一、四大用途静态变量(类变量) 作用:属于类,而非实例。所有实例共…

算法训练营DAY50 第十一章:图论part01

98. 所有可达路径 98. 所有可达路径 【题目描述】 给定一个有 n 个节点的有向无环图,节点编号从 1 到 n。请编写一个程序,找出并返回所有从节点 1 到节点 n 的路径。每条路径应以节点编号的列表形式表示。 【输入描述】 第一行包含两个整数 N&#…

OpenCV:从入门到实战的全方位指南

目录 一、OpenCV 简介 (一)特点 (二)应用场景 二、OpenCV 的核心模块 (一)core 模块 (二)imgproc 模块 (三)video 模块 (四)f…

如何在 Ubuntu 24.04 上安装和配置 TFTP 服务器

了解如何在 Ubuntu 24.04 Linux 上安装 TFTP 以执行基本的文件传输。 简单文件传输协议(TFTP)是标准 FTP 的轻量级替代方案,用于在联网设备之间传输文件。与 FTP 和 HTTP 相比,TFTP 更简单,无需复杂的客户端-服务器模型即可操作。这就是为什么该协议用于执行基本文件传输…

基于 AXI-Lite 实现可扩展的硬件函数 RPC 框架(附完整源码)

AXI-Lite 实现RPC调用硬件函数服务 👋 本文介绍如何基于 AXI-Lite 总线设计一个通用的“硬件函数调用框架”。主机端(PS)只需通过寄存器写入参数与启动标志,即可触发 PL 模块执行指定算法逻辑,并将结果返回。 该机制本…

[spring-cloud: NamedContextFactory ClientFactoryObjectProvider]-源码阅读

依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-commons</artifactId><version>4.3.0</version> </dependency>源码 NamedContextFactory NamedContextFactory 类通过创建多个子…

HBase MOB技术特点及使用场景介绍

在 HBase 2.0 版本之前,虽然 HBase 能够存储从 1 字节到 10MB 大小的二进制对象 ,但其读写路径主要针对小于 100KB 的值进行了优化。当面对大量大小在 100KB - 10MB 之间的数据时,传统的存储方式就会暴露出问题。例如,当存储大量的图片、文档或短视频等中等大小对象时,由于…

Ubuntu 配置密钥+密码登录

目录 1、密钥生成 2、发送公钥至 需要连接的服务器 3、选用私钥登录 1、密钥生成 ssh-keygen -t rsa -b 4096 -C "angindem"2、发送公钥至 需要连接的服务器 将.ssh中的id_rsa.pub 的密钥&#xff0c;放在authorized_keys中 注意&#xff1a;.ssh 文件夹一定赋予…

谷歌浏览器Chrome 缓存迁移

步骤 1&#xff1a;准备数据迁移1. 关闭 Chrome 及所有后台进程在任务管理器&#xff08;CtrlShiftEsc&#xff09;中结束所有 chrome.exe 进程。 2. 备份并移动原数据- 将 C:\Users\xxx\AppData\Local\Google\Chrome\User Data **整个文件夹**复制到新位置&#xff08;如 G:\…