当前位置: 首页 > news >正文

PHP魔术方法详解

__construct()

构造函数用于初始化新创建的对象。PHP 5 之后不推荐使用类名作为构造函数。

class Person {public $name;public $age;public function __construct($name, $age) {$this->name = $name;$this->age = $age;}
}$person = new Person("Alice", 30);

__destruct()

析构函数在对象被销毁前调用,用于释放资源或进行一些清理操作。

class Person {public function __destruct() {// 清理资源或执行其他尾部操作echo "Destroying " . $this->name . "\n";}
}$person = new Person("Alice", 30);
unset($person); // 显示销毁对象

__call($name, $arguments)

尝试调用对象中不可访问的方法时调用。

class Person {private function greet($greeting) {return $greeting . ", I am " . $this->name;}public function __call($name, $arguments) {if (method_exists($this, $name)) {return call_user_func_array([$this, $name], $arguments);}throw new Exception("Call to undefined method " . __CLASS__ . "::$name");}
}$person = new Person("Alice", 30);
echo $person->greet("Hello"); // 不能直接调用private方法,通过__call间接调用

__callStatic($name, $arguments)

尝试调用类中不可访问的静态方法时调用。

class Person {private static function greet($greeting) {return $greeting . ", This is " . __CLASS__;}public static function __callStatic($name, $arguments) {if (method_exists(__CLASS__, $name)) {return forward_static_call_array([__CLASS__, $name], $arguments);}throw new Exception("Call to undefined static method " . __CLASS__ . "::$name");}
}echo Person::greet("Hello"); // 不能直接调用private方法,通过__callStatic间接调用

__get($name)

尝试访问对象中不可访问的属性时调用。

class Person {private $data = array('name' => 'Alice', 'age' => 30);public function __get($name) {if (array_key_exists($name, $this->data)) {return $this->data[$name];}throw new Exception("Undefined property: " . __CLASS__ . "::$name");}
}$person = new Person();
echo $person->name; // 不能直接访问private属性,通过__get间接访问

__set($name, $value)

尝试设置对象中不可访问的属性时调用。

class Person {private $data = array();public function __set($name, $value) {$this->data[$name] = $value;}
}$person = new Person();
$person->name = "Alice"; // 不能直接设置private属性,通过__set间接设置

__isset($name)

当对对象中不可访问的属性调用isset()empty()时调用。

class Person {private $data = array('name' => 'Alice', 'age' => 30);public function __isset($name) {return isset($this->data[$name]);}
}$person = new Person();
var_dump(isset($person->name)); // 输出bool(true)

__unset($name)

尝试对对象中不可访问的属性调用unset()时调用。

class Person {private $data = array('name' => 'Alice', 'age' => 30);public function __unset($name) {unset($this->data[$name]);}
}$person = new Person();
unset($person->name); // 不能直接unset private属性,通过__unset间接进行

__sleep()

调用serialize()序列化对象时调用。

class Person {public $name;public $age;private $data;public function __construct($name, $age) {$this->name = $name;$this->age = $age;$this->data = rand(); // 数据不适合序列化}public function __sleep() {// 指定序列化时保存的属性return array('name', 'age');}
}$person = new Person("Alice", 30);
$serializedPerson = serialize($person);

__wakeup()

调用unserialize()反序列化对象时调用。

class Person {public $name;public $age;public function __wakeup() {// 反序列化之后的操作,例如重新建立数据库连接$this->reconnect();}private function reconnect() {// 重建连接的代码}
}$person = unserialize($serializedPerson);

__serialize()

PHP 7.4及以上版本,当你需要自定义对象的序列化逻辑时使用。

class Person {public $name;public $age;private $data;public function __serialize(): array {// 返回一个数组,包含序列化时需要的所有属性return ['name' => $this->name,'age' => $this->age,];}
}$person = new Person("Alice", 30);
$serializedPerson = serialize($person);

__unserialize(array $data)

PHP 7.4及以上版本,当你需要自定义对象的反序列化逻辑时使用。

class Person {public $name;public $age;public function __unserialize(array $data): void {$this->name = $data['name'];$this->age = $data['age'];// 可以在这里执行其他反序列化后的初始化操作}
}$person = unserialize($serializedPerson);

__toString()

当一个对象被当作字符串使用时自动调用。

class Person {private $name = "Alice";public function __toString() {return $this->name;}
}$person = new Person();
echo $person; // 输出"Alice"

__invoke()

对象作为函数使用时自动调用。

class CallablePerson {public function __invoke($greeting) {return $greeting . ", I am a callable object!";}
}$person = new CallablePerson();
echo $person("Hello"); // 输出"Hello, I am a callable object!"

__set_state($properties)

当使用var_export()导出类的实例时调用。

class Person {public $name;public $age;public static function __set_state($properties) {$obj = new Person();$obj->name = $properties['name'];$obj->age = $properties['age'];return $obj;}
}$person = new Person();
$person->name = "Alice";
$person->age = 30;
echo var_export($person, true); // 导出类的实例

__clone()

当对象被克隆时自动调用,用于深复制对象中的属性。

class Person {public $name;public $age;public $address;public function __clone() {// 当包含对象时,确保进行深复制$this->address = clone $this->address;}
}$person1 = new Person();
$person1->address = new Address();
$person2 = clone $person1;

__debugInfo()

当使用var_dump()显示对象信息时调用。

class Person {private $data = array('name' => 'Alice', 'age' => 30);public function __debugInfo() {return ['name' => $this->data['name'],'age' => $this->data['age'],// 隐藏敏感数据或不相关的内部信息];}
}$person = new Person();
var_dump($person);

以上例子提供了一些常见的用法和场景,这些魔术方法让对象的行为更加灵活和可控。

相关文章:

PHP魔术方法详解

__construct() 构造函数用于初始化新创建的对象。PHP 5 之后不推荐使用类名作为构造函数。 class Person {public $name;public $age;public function __construct($name, $age) {$this->name $name;$this->age $age;} }$person new Person("Alice", 30);…...

游戏 AI 反作弊|内附解决方案详情!

我们提出使用在游戏中广泛存在的回放日志数据,重构出玩家当局的表现。在回放 日志数据中,我们构建了玩家的时序行为数据,并基于该时序行为数据,分别搭建 了透视和自瞄外挂检测系统,该方法和系统可广泛应用于各种在线…...

elementUI组件库样式修改整理

一、整体修改样式注意点 避免!important,能使用深度选择器就用深度选择器主题色使用变量,方便后期统一修改,最好新建一个单独的文件,专门用于定义公共变量样式文件尽量放在一个文件里,方便后期维护 二、单独element …...

还是了解下吧,大语言模型调研汇总

大语言模型调研汇总 一. Basic Language ModelT5GPT-3LaMDAJurassic-1MT-NLGGopherChinchillaPaLMU-PaLMOPTLLaMABLOOMGLM-130BERNIE 3.0 Titan 二. Instruction-Finetuned Language ModelT0FLANFlan-LMBLOOMZ & mT0GPT-3.5ChatGPTGPT-4AlpacaChatGLMERNIE BotBard 自从Cha…...

Win11初始化系统遇一文解决

这个是目录 一、设置内的初始化无法使用时,使用以下工具二、将桌面移动到D盘三、解决win11桌面右键创建只有一个带盾牌的文件夹问题四、win11 系统停止更新五、office安装1、使用的是 Office Tool plus2、使用WPS 六、D盘有感叹号七、打开组策略编辑器(gpedit.msc)失…...

vr虚拟现实游戏世界介绍|数字文化展览|VR元宇宙文旅

虚拟现实(VR)游戏世界是一种通过虚拟现实技术创建的沉浸式游戏体验,玩家可以穿上VR头显,仿佛置身于游戏中的虚拟世界中。这种技术让玩家能够全方位、身临其境地体验游戏,与游戏中的环境、角色和物体互动。 在虚拟现实游…...

kotlin 程序 编译与执行

准备kotlin环境 Ubuntu安装kotlin 1. 创建一个名为 hello.kt 文件&#xff0c;代码如下&#xff1a; fun main(args: Array<String>) {println("Hello, World!") }2. 使用 Kotlin 编译器编译应用 kotlinc hello.kt -include-runtime -d hello.jar-d: 用来设…...

Python学习:注释和运算符

python 注释 在Python中&#xff0c;注释用于在代码中添加解释、说明或者提醒&#xff0c;但并不会被解释器执行。Python中的注释以#开头&#xff0c;直到行末为止。下面是关于Python注释的详细解释和举例&#xff1a; 单行注释&#xff1a;使用#符号在行的开头添加注释&…...

英伟达 V100、A100/800、H100/800 GPU 对比

近期&#xff0c;不论是国外的 ChatGPT&#xff0c;还是国内诸多的大模型&#xff0c;让 AIGC 的市场一片爆火。而在 AIGC 的种种智能表现背后&#xff0c;均来自于堪称天文数字的算力支持。以 ChatGPT 为例&#xff0c;据微软高管透露&#xff0c;为 ChatGPT 提供算力支持的 A…...

Spark面试重点

文章目录 1.简述hadoop 和 spark 的不同点&#xff08;为什么spark更快&#xff09;2.谈谈你对RDD的理解3.简述spark的shuffle过程4. groupByKey和reduceByKey的区别 1.简述hadoop 和 spark 的不同点&#xff08;为什么spark更快&#xff09; Hadoop 和 Spark 是两种用于大数据…...

UGUI源码分析与研究2-从底层实现的角度去分析和调优UI的性能问题和疑难杂症

从底层实现的角度去分析和调优UI的性能问题和疑难杂症&#xff0c;可以从以下几个方面入手&#xff1a; 绘制性能优化&#xff1a;UI的绘制是一个重要的性能瓶颈&#xff0c;可以通过以下方式进行优化&#xff1a; 减少绘制区域&#xff1a;只绘制可见区域&#xff0c;避免不必…...

OpenAI的GPT已达极限,更看好AI Agent

日前&#xff0c;比尔盖茨发表文章表示&#xff1a;AI Agent不仅会改变人与电脑的互动方式&#xff0c;或许还将颠覆软件行业&#xff0c;引领自输入命令到点击图标以来的最大计算机革命。 在数字化和技术创新的浪潮中&#xff0c;AI Agent作为一种前沿技术&#xff0c;正开启…...

【C/C++】详解 assert() 断言(什么是assert? assert有什么作用?)

目录 一、前言 二、什么是 assert ? 三、assert 的用法 四、assert 案例解析 五、assert 断言的使用原则 六、共勉 一、前言 在编写程序过程中&#xff0c;尤其是调试代码时&#xff0c;往往需要一个提醒代码漏洞/Bug的小助手&#xff0c;以便于程序员及时修改和完善代码…...

[C++]20:unorderedset和unorderedmap结构和封装。

unorderedset和unorderedmap结构和封装 一.哈希表&#xff1a;1.直接定址法&#xff1a;2.闭散列的开放定址法&#xff1a;1.基本结构&#xff1a;2.insert3.find4.erase5.补充&#xff1a;6.pair<k,v> k的数据类型&#xff1a; 3.开散列的拉链法/哈希桶&#xff1a;1.基…...

ARM 汇编指令:(六) B 跳转指令

目录 一.B 和 BL 1.B/BL指令的语法格式 2.示例解析 一.B 和 BL 跳转指令 B 使程序跳转到指定的地址执行程序。指令 BL 将下一条指令的地址复制到 R14&#xff08;即返回地址连接寄存器 LR&#xff09;寄存器中&#xff0c;然后跳转到指定地址运行程序。 1.B/B…...

​​SQLiteC/C++接口详细介绍之sqlite3类(十一)

返回目录&#xff1a;SQLite—免费开源数据库系列文章目录 上一篇&#xff1a;​​SQLiteC/C接口详细介绍之sqlite3类&#xff08;十&#xff09; 下一篇&#xff1a;​​SQLiteC/C接口详细介绍之sqlite3类&#xff08;十二&#xff09;&#xff08;未发表&#xff09; 33.sq…...

百度智能云+SpringBoot=AI对话【人工智能】

百度智能云SpringBootAI对话【人工智能】 前言版权推荐百度智能云SpringBootAI对话【人工智能】效果演示登录AI对话 项目结构后端开发pom和propertiessql_table和entitydao和mapperservice和implconfig和utilLoginController和ChatController 前端开发css和jslogin.html和chat.…...

第二十七节 Java 多态

本章主要为大家介绍java多态的概念&#xff0c;以及便于理解的多态简单例子。 Java 多态 多态是同一个行为具有多个不同表现形式或形态的能力。 多态性是对象多种表现形式的体现。 比如我们说"宠物"这个对象&#xff0c;它就有很多不同的表达或实现&#xff0c;比…...

基于Springboot的员工健康管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的员工健康管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…...

[论文精读]Dynamic Coarse-to-Fine Learning for Oriented Tiny Object Detection

论文网址&#xff1a;[2304.08876] 用于定向微小目标检测的动态粗到细学习 (arxiv.org) 论文代码&#xff1a;https://github.com/ChaselTsui/mmrotate-dcfl 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...

深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向

在人工智能技术呈指数级发展的当下&#xff0c;大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性&#xff0c;吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型&#xff0c;成为释放其巨大潜力的关键所在&…...

前端高频面试题2:浏览器/计算机网络

本专栏相关链接 前端高频面试题1&#xff1a;HTML/CSS 前端高频面试题2&#xff1a;浏览器/计算机网络 前端高频面试题3&#xff1a;JavaScript 1.什么是强缓存、协商缓存&#xff1f; 强缓存&#xff1a; 当浏览器请求资源时&#xff0c;首先检查本地缓存是否命中。如果命…...

2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案

一、延迟敏感行业面临的DDoS攻击新挑战 2025年&#xff0c;金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征&#xff1a; AI驱动的自适应攻击&#xff1a;攻击流量模拟真实用户行为&#xff0c;差异率低至0.5%&#xff0c;传统规则引…...

【若依】框架项目部署笔记

参考【SpringBoot】【Vue】项目部署_no main manifest attribute, in springboot-0.0.1-sn-CSDN博客 多一个redis安装 准备工作&#xff1a; 压缩包下载&#xff1a;http://download.redis.io/releases 1. 上传压缩包&#xff0c;并进入压缩包所在目录&#xff0c;解压到目标…...

负载均衡器》》LVS、Nginx、HAproxy 区别

虚拟主机 先4&#xff0c;后7...

在Zenodo下载文件 用到googlecolab googledrive

方法&#xff1a;Figshare/Zenodo上的数据/文件下载不下来&#xff1f;尝试利用Google Colab &#xff1a;https://zhuanlan.zhihu.com/p/1898503078782674027 参考&#xff1a; 通过Colab&谷歌云下载Figshare数据&#xff0c;超级实用&#xff01;&#xff01;&#xff0…...