PHP中的魔术方法
在 PHP 中,以两个下划线 __ 开头的方法被称为魔术方法,它们在特定场景下会自动被调用,以下是一些常见的魔术方法:
1.__construct():类的构造函数,在对象创建完成后第一个自动调用,用于执行初始化任务,如对成员属性赋予初始值。每个类若未显式声明,会默认存在一个无参且内容为空的构造方法。同一类中只能声明一个构造方法,PHP 不支持构造函数重载。例如:
class Person {public $name;public $age;public function __construct($name = "", $age = 22) {$this->name = $name;$this->age = $age;}public function say() {echo "我叫:". $this->name. ",年龄:". $this->age;}
}
$person1 = new Person();
echo $person1->say(); // 输出:我叫:,年龄:22
$person2 = new Person("小明", 18);
echo $person2->say(); // 输出:我叫:小明,年龄:18
2.__destruct():类的析构函数,当对象不再被使用、即将被销毁时调用,可用于执行清理工作,如关闭文件句柄、释放资源等。
class FileHandler {private $file;public function __construct($filename) {$this->file = fopen($filename, 'r');}public function __destruct() {if ($this->file) {fclose($this->file);}}
}
3.__call():当调用对象中不存在的方法时触发,可用于捕获方法调用,实现如代理模式(在代理类中定义一个捕获方法,代理类中没有这个方法时去调用真实对象里的方法)等设计模式。它接收两个参数,$name 为方法名,$arguments 为方法参数数组。
class Proxy {public function __call($name, $arguments) {echo "调用了不存在的方法 $name ,参数为:". implode(', ', $arguments);}
}
$proxy = new Proxy();
$proxy->nonexistentMethod('param1', 'param2');
4.__callStatic():在静态上下文中调用不存在的静态方法时执行,与 __call() 类似,用于处理静态方法的动态调用。
class StaticProxy {public static function __callStatic($name, $arguments) {echo "调用了不存在的静态方法 $name ,参数为:". implode(', ', $arguments);}
}
StaticProxy::nonexistentStaticMethod('param1', 'param2');
5.__get():当读取一个不存在的属性时调用,可用于实现属性的重载。
class PropertyOverload {private $data = [];public function __get($name) {return $this->data[$name]?? null;}
}
$obj = new PropertyOverload();
echo $obj->nonExistentProperty;
6.__set():在给一个不存在的属性赋值时触发。
class PropertyOverload {private $data = [];public function __set($name, $value) {$this->data[$name] = $value;}
}
$obj = new PropertyOverload();
$obj->newProperty = "value";
7.__isset():使用 isset() 或 empty() 检测一个不存在的属性时调用。
class PropertyCheck {private $data = [];public function __isset($name) {return isset($this->data[$name]);}
}
$obj = new PropertyCheck();
var_dump(isset($obj->nonExistentProperty));
8.__unset():使用 unset() 销毁一个不存在的属性时触发。
class PropertyDestroy {private $data = [];public function __unset($name) {if (isset($this->data[$name])) {unset($this->data[$name]);}}
}
$obj = new PropertyDestroy();
$obj->property = "value";
unset($obj->property);
9.__toString():当对象被当作字符串使用(如在 echo 语句中)时调用,用于定义对象的字符串表示形式。
class ObjectToString {public function __toString() {return "这是一个对象";}
}
$obj = new ObjectToString();
echo $obj;
10.__invoke():尝试以调用函数的方式调用对象时触发,使对象可像闭包一样被调用。
class InvokableObject {public function __invoke($param) {echo "对象被调用,参数为:". $param;}
}
$obj = new InvokableObject();
$obj('test');
补充(闭包:closure = function() use (var) { echo var; };这行代码,closure是一个变量,它被赋值为一个匿名函数,就是function() { echo var; }这部分。use (var)的意思是,让这个匿名函数可以访问外部的$var变量。然后在函数内部,用echo var;来输出这个变量的值。这样就定义好了一个闭包。当你调用closure();的时候,它就会执行匿名函数里的代码,也就是输出$var的值。n'b)
11.__sleep():在序列化对象时调用,可清理对象并返回一个包含所有要序列化属性名称的数组。(可以进行清理工作,同时会返回数组里面是你要序列化的属性,我的理解是轻减了序列化的内容)
class SerializableObject {private $data1;private $data2;public function __sleep() {return ['data1', 'data2'];}
}
$obj = new SerializableObject();
$serialized = serialize($obj);
12.__wakeup():PHP 反序列化对象时调用,通常用于重新建立数据库连接或执行其他初始化任务。(和__sleep相反,可以重新连接数据库,恢复数据等操作)
class SerializableObject {private $data1;private $data2;public function __wakeup() {// 重新建立数据库连接等初始化操作}
}
$serialized = '...'; // 假设已存在序列化后的字符串
$obj = unserialize($serialized);相关文章:
PHP中的魔术方法
在 PHP 中,以两个下划线 __ 开头的方法被称为魔术方法,它们在特定场景下会自动被调用,以下是一些常见的魔术方法: 1.__construct():类的构造函数,在对象创建完成后第一个自动调用,用于执行初始…...
Git、Github和Gitee完整讲解:丛基础到进阶功能
第一部分:Git 是什么? 比喻:Git就像是一本“时光机日记本” 每一段代码的改动,Git都会帮你记录下来,像是在写日记。如果出现问题或者想查看之前的版本,Git可以带你“穿越回过去”,找到任意时间…...
相对收益-固定收益组合归因-加权久期归因模型
固定收益组合归因-加权久期归因模型和Campisi模型 1 加权久期归因模型--推导方式11.1 债券策略组合收益率的分解1.1.2 加权久期归因(1)总久期贡献(2)债券类属配置贡献 1.1.3 如何应用加权久期归因 2 加权久期归因模型--推导方式22…...
原生鸿蒙版小艺APP接入DeepSeek-R1,为HarmonyOS应用开发注入新活力
原生鸿蒙版小艺APP接入DeepSeek-R1,为HarmonyOS应用开发注入新活力 在科技飞速发展的当下,人工智能与操作系统的融合正深刻改变着我们的数字生活。近日,原生鸿蒙版小艺APP成功接入DeepSeek-R1,这一突破性进展不仅为用户带来了更智…...
RabbitMQ 从入门到精通:从工作模式到集群部署实战(三)
文章目录 使用CLI管理RabbitMQrabbitmqctlrabbitmq-queuesrabbitmq-diagnosticsrabbitmq-pluginsrabbitmq-streamsrabbitmq-upgraderabbitmqadmin 使用CLI管理RabbitMQ RabbitMQ CLI 工具需要安装兼容的 Erlang/OTP版本。 这些工具假定系统区域设置为 UTF-8(例如en…...
AI-学习路线图-PyTorch-我是土堆
1 需求 PyTorch深度学习快速入门教程(绝对通俗易懂!)【小土堆】_哔哩哔哩_bilibili PyTorch 深度学习快速入门教程 配套资源 链接 视频教程 https://www.bilibili.com/video/BV1hE411t7RN/ 文字教程 https://blog.csdn.net/xiaotudui…...
2.1 Mockito核心API详解
Mockito核心API详解 1. 创建Mock对象 Mockito提供两种方式创建模拟对象: 1.1 手动创建(传统方式) // 创建接口/类的Mock对象 UserDao userDao Mockito.mock(UserDao.class);1.2 注解驱动(推荐方式) 结合JUnit 5的…...
傅里叶单像素成像技术研究进展
摘要:计算光学成像,通过光学系统和信号处理的有机结合与联合优化实现特定成像特性的成像系统,摆脱了传统成像系统的限制,为光学成像技术添加了浓墨重彩的一笔,并逐步向简单化与智能化的方向发展。单像素成像(Single-Pi…...
可视化工作流编排参数配置完整方案设计文档
一、背景及需求分析 1. 背景 在复杂的工作流程中,后续程序需要动态构造输入参数,这些参数源自多个前序程序的 JSON 数据输出。为了增强系统的灵活性和可扩展性,配置文件需要支持以下功能: 灵活映射前序程序的 JSON 数据。…...
镜头放大倍率和像素之间的关系
相互独立的特性 镜头放大倍率:主要取决于镜头的光学设计和结构,决定了镜头对物体成像时的缩放程度,与镜头的焦距等因素密切相关。比如,微距镜头具有较高的放大倍率,能将微小物体如昆虫、花朵细节等放大成像࿰…...
MariaDB *MaxScale*实现mysql8读写分离
1.MaxScale 是干什么的? MaxScale是maridb开发的一个mysql数据中间件,其配置简单,能够实现读写分离,并且可以根据主从状态实现写库的自动切换,对多个从服务器能实现负载均衡。 2.MaxScale 实验环境 中间件192.168.12…...
计算机毕业设计Spark+大模型知网文献论文推荐系统 知识图谱 知网爬虫 知网数据分析 知网大数据 知网可视化 预测系统 大数据毕业设计 机器学习
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
MySQL的事务实现原理和隔离级别?
目录 MySQL 事务实现原理 1. 事务的基本概念 2. 实现原理 日志系统 锁机制 MySQL 隔离级别 1. 隔离级别概述 2. 各隔离级别详解 读未提交(Read Uncommitted) 读已提交(Read Committed) 可重复读(Repeatable Read) 串行化(Serializable) 3. 设置隔离级别 My…...
JVM做GC垃圾回收时需要多久,都由哪些因素决定的
JVM进行垃圾回收(GC)的时间长短受多种因素影响,主要包括以下几个方面: 1. 堆内存大小 堆内存越大,GC需要扫描和回收的对象越多,耗时越长。堆内存较小时,GC频率增加,但每次回收的时…...
padding: 20rpx 0rpx 20rpx 20rpx(上、右、下、左的填充(顺时针方向))
CSS样式 padding: 20rpx 0rpx 20rpx 20rpx; 用于设置元素的填充区域。以下是对每个值的详细解释: 20rpx(上边距):设置元素顶部的填充为20rpx。0rpx(右边距):设置元素右侧的填充为0rpx。20rpx&a…...
2025-2-10-4.4 双指针(基础题1)
文章目录 4.4 双指针(基础题)**344. 反转字符串****125. 验证回文串****1750. 删除字符串两端相同字符后的最短长度****167.两数之和 II - 输入有序数组****2105. 给植物浇水 II****977. 有序数组的平方****658. 找到K个最接近的元素****1471. 数组中的k…...
Qt - 地图相关 —— 2、Qt调用百度在线地图功能示例全集,包含线路规划、地铁线路查询等(附源码)
效果:由于录制软件导致exe显示不正常,实际运行没有任何问题。 说明:exe试用下载(提取码: 4d8y )...
微信小程序如何使用decimal计算金额
第三方库地址:GitHub - MikeMcl/decimal.js: An arbitrary-precision Decimal type for JavaScript 之前都是api接口走后端计算,偶尔发现这个库也不错,计算简单,目前发现比较准确 上代码 导入js import Decimal from ../../uti…...
【AI学习】关于 DeepSeek-R1的几个流程图
遇见关于DeepSeek-R1的几个流程图,清晰易懂形象直观,记录于此。 流程图一 来自文章《Understanding Reasoning LLMs》, 文章链接:https://magazine.sebastianraschka.com/p/understanding-reasoning-llms?continueFlagaf07b1a0…...
C++模板编程——typelist的实现
文章最后给出了汇总的代码,可直接运行 1. typelist是什么 typelist是一种用来操作类型的容器。和我们所熟知的vector、list、deque类似,只不过typelist存储的不是变量,而是类型。 typelist简单来说就是一个类型容器,能够提供一…...
Python3 ImportError: cannot import name ‘XXX‘ from ‘XXX‘
个人博客地址:Python3 ImportError: cannot import name XXX from XXX | 一张假钞的真实世界 例如如下错误: $ python3 git.py Traceback (most recent call last):File "git.py", line 1, in <module>from git import RepoFile &quo…...
数据可视化与交互融合:APP 界面设计的新维度
在数字化浪潮汹涌的当下,APP 已成为人们生活和工作中不可或缺的工具。如何在众多 APP 中脱颖而出,界面设计至关重要。而数据可视化与交互的融合,正为 APP 界面设计开辟了全新的维度。 数据可视化,简单来说,就是将复杂…...
502 Bad Gateway 错误详解:从表现推测原因,逐步排查直至解决
502 Bad Gateway 错误通常意味着服务器之间的通信失败,但导致的具体原因往往因场景而异。 场景一:高峰期频繁出现 502 错误 1.1 现象 在流量高峰期间(如促销活动、直播发布等),页面访问变慢甚至出现 502 错误&#…...
控制论与信息论:维纳和香农的核心分歧在于对「信息本质」的理解
控制论与信息论:维纳和香农的核心分歧在于对「信息本质」的理解 核心结论 控制论是「系统的方向盘」,通过反馈调节实现目标信息论是「信息的尺子」,量化信息传输的精度与效率根本分歧:维纳认为信息是「系统维持秩序的工具」&…...
Baklib优化数字化内容管理用科技提升商业效率与增值潜力
内容概要 在当今数字化迅速发展的时代,数字化内容管理已成为企业提升竞争力的重要手段。Baklib作为一款强大的智能优化内容管理系统,通过先进的科技手段,帮助企业在内容管理和数据整合方面实现高效运作。Baklib 是什么类型的工具,…...
一个基于ESP32S3和INMP441麦克风实现音频强度控制RGB灯带律动的代码及效果展示
一个基于ESP32S3和INMP441麦克风实现音频强度控制RGB灯带律动的代码示例,使用Arduino语言: 硬件连接 INMP441 VCC → ESP32的3.3VINMP441 GND → ESP32的GNDINMP441 SCK → ESP32的GPIO 17INMP441 WS → ESP32的GPIO 18INMP441 SD → ESP32的GPIO 16RG…...
利用二分法进行 SQL 时间盲注
什么是时间盲注? SQL 盲注(Blind SQL Injection)是一种常见的 Web 安全漏洞,其中时间盲注是基于查询延迟的 SQL 注入方式。当服务器不返回可见的错误信息时,我们可以利用 SLEEP() 函数来判断查询结果是否符合预期。 …...
Linux运维——用户管理
Linux用户管理 一、Linux用户管理要点二、常用命令2.1、groupadd2.2、groupdel2.3、groupmod2.4、groups2.5、useradd2.6、userdel2.7、passwd2.9、su2.10、sudo2.10.1、给普通用户授权 sudo2.10.2、 免密码授权 sudo 一、Linux用户管理要点 创建用户组 - 使用 groupadd删除用…...
基于STM32的声纹识别智能门锁
一、项目背景与意义 行业痛点:传统指纹锁存在表皮磨损识别失败风险,声纹具备活体检测特性 技术优势: - 采用MFCC(梅尔频率倒谱系数)替代传统FFT,提升说话人特征区分度 - 动态时间规整(DTW)算法解决语…...
【密评】 | 商用密码应用安全性评估从业人员考核题库(19)
在SM9数字签名的生成和验证过程之前,杂凑函数( )。 A.仅对待签名消息进行压缩 B.仅对待验证消息进行压缩 C.对待签名消息和待验证消息都要压缩 D.不起任何作用 SM9密钥封装机制封装的秘密密钥是( )生成的。 A.根据主公钥 B.根据接受者的用户标识 C.由随机数发生器 D.以上都…...
