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 文件,代码如下: fun main(args: Array<String>) {println("Hello, World!") }2. 使用 Kotlin 编译器编译应用 kotlinc hello.kt -include-runtime -d hello.jar-d: 用来设…...
Python学习:注释和运算符
python 注释 在Python中,注释用于在代码中添加解释、说明或者提醒,但并不会被解释器执行。Python中的注释以#开头,直到行末为止。下面是关于Python注释的详细解释和举例: 单行注释:使用#符号在行的开头添加注释&…...
英伟达 V100、A100/800、H100/800 GPU 对比
近期,不论是国外的 ChatGPT,还是国内诸多的大模型,让 AIGC 的市场一片爆火。而在 AIGC 的种种智能表现背后,均来自于堪称天文数字的算力支持。以 ChatGPT 为例,据微软高管透露,为 ChatGPT 提供算力支持的 A…...
Spark面试重点
文章目录 1.简述hadoop 和 spark 的不同点(为什么spark更快)2.谈谈你对RDD的理解3.简述spark的shuffle过程4. groupByKey和reduceByKey的区别 1.简述hadoop 和 spark 的不同点(为什么spark更快) Hadoop 和 Spark 是两种用于大数据…...
UGUI源码分析与研究2-从底层实现的角度去分析和调优UI的性能问题和疑难杂症
从底层实现的角度去分析和调优UI的性能问题和疑难杂症,可以从以下几个方面入手: 绘制性能优化:UI的绘制是一个重要的性能瓶颈,可以通过以下方式进行优化: 减少绘制区域:只绘制可见区域,避免不必…...
OpenAI的GPT已达极限,更看好AI Agent
日前,比尔盖茨发表文章表示:AI Agent不仅会改变人与电脑的互动方式,或许还将颠覆软件行业,引领自输入命令到点击图标以来的最大计算机革命。 在数字化和技术创新的浪潮中,AI Agent作为一种前沿技术,正开启…...
【C/C++】详解 assert() 断言(什么是assert? assert有什么作用?)
目录 一、前言 二、什么是 assert ? 三、assert 的用法 四、assert 案例解析 五、assert 断言的使用原则 六、共勉 一、前言 在编写程序过程中,尤其是调试代码时,往往需要一个提醒代码漏洞/Bug的小助手,以便于程序员及时修改和完善代码…...
[C++]20:unorderedset和unorderedmap结构和封装。
unorderedset和unorderedmap结构和封装 一.哈希表:1.直接定址法:2.闭散列的开放定址法:1.基本结构:2.insert3.find4.erase5.补充:6.pair<k,v> k的数据类型: 3.开散列的拉链法/哈希桶:1.基…...
ARM 汇编指令:(六) B 跳转指令
目录 一.B 和 BL 1.B/BL指令的语法格式 2.示例解析 一.B 和 BL 跳转指令 B 使程序跳转到指定的地址执行程序。指令 BL 将下一条指令的地址复制到 R14(即返回地址连接寄存器 LR)寄存器中,然后跳转到指定地址运行程序。 1.B/B…...
SQLiteC/C++接口详细介绍之sqlite3类(十一)
返回目录:SQLite—免费开源数据库系列文章目录 上一篇:SQLiteC/C接口详细介绍之sqlite3类(十) 下一篇:SQLiteC/C接口详细介绍之sqlite3类(十二)(未发表) 33.sq…...
百度智能云+SpringBoot=AI对话【人工智能】
百度智能云SpringBootAI对话【人工智能】 前言版权推荐百度智能云SpringBootAI对话【人工智能】效果演示登录AI对话 项目结构后端开发pom和propertiessql_table和entitydao和mapperservice和implconfig和utilLoginController和ChatController 前端开发css和jslogin.html和chat.…...
第二十七节 Java 多态
本章主要为大家介绍java多态的概念,以及便于理解的多态简单例子。 Java 多态 多态是同一个行为具有多个不同表现形式或形态的能力。 多态性是对象多种表现形式的体现。 比如我们说"宠物"这个对象,它就有很多不同的表达或实现,比…...
基于Springboot的员工健康管理系统(有报告)。Javaee项目,springboot项目。
演示视频: 基于Springboot的员工健康管理系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构…...
[论文精读]Dynamic Coarse-to-Fine Learning for Oriented Tiny Object Detection
论文网址:[2304.08876] 用于定向微小目标检测的动态粗到细学习 (arxiv.org) 论文代码:https://github.com/ChaselTsui/mmrotate-dcfl 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...
