当前位置: 首页 > 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。可能会出现难以避免的拼写错误和语法错误&…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

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 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...

什么是VR全景技术

VR全景技术&#xff0c;全称为虚拟现实全景技术&#xff0c;是通过计算机图像模拟生成三维空间中的虚拟世界&#xff0c;使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验&#xff0c;结合图文、3D、音视频等多媒体元素…...