PHP中的魔术函数

PHP 魔术函数是在某些情况下会自动调用的特殊函数,它们以双下划线 `__` 开头,以下是对常见 PHP 魔术函数的详细介绍:

### 构造函数和析构函数
- **__construct()**:
    - 这是一个构造函数,在创建类的新对象时会自动调用。它可以用于初始化对象的属性,执行必要的设置操作。
    ```php
   

 class MyClass {public function __construct() {echo "对象被创建了。";}}$obj = new MyClass(); 


    ```
    - 上述代码在创建 `MyClass` 对象时,会自动调用 `__construct()` 函数,输出 "对象被创建了。"。
- **__destruct()**:
    - 析构函数,在对象销毁时自动调用。常用于清理对象使用的资源,比如关闭文件、释放数据库连接等。
    ```php
   

 class MyClass {public function __destruct() {echo "对象被销毁了。";}}$obj = new MyClass(); 


    // 当程序执行结束或对象不再被引用时,会调用析构函数
    ```


### 方法重载相关
- **__call($name, $arguments)**:
    - 当调用一个不存在的方法时会触发该函数。`$name` 是方法名,`$arguments` 是传递给这个不存在方法的参数数组。
    ```php
 

  class MyClass {public function __call($name, $arguments) {echo "调用了不存在的方法:".$name.",参数为:";print_r($arguments);}}$obj = new MyClass();$obj->someMethod("param1", "param2"); 


    ```
    - 当调用 `someMethod` 时,因为该方法不存在,会调用 `__call` 函数并输出相应信息。
- **__callStatic($name, $arguments)**:
    - 当调用一个不存在的静态方法时会触发,与 `__call` 类似,但用于静态方法。
    ```php
   

class MyClass {public static function __callStatic($name, $arguments) {echo "调用了不存在的静态方法:".$name.",参数为:";print_r($arguments);}}MyClass::someStaticMethod("param1", "param2"); 


    ```


### 属性重载相关
- **__get($name)**:
    - 当尝试访问不可访问(如私有或不存在)的属性时调用,`$name` 是属性名。
    ```php
 

  class MyClass {private $data = array();public function __get($name) {if (isset($this->data[$name])) {return $this->data[$name];}return null;}}$obj = new MyClass();echo $obj->nonExistentProperty; 


    ```
    - 这里访问 `nonExistentProperty` 会调用 `__get` 函数,在该函数中可对属性访问进行逻辑处理。
- **__set($name, $value)**:
    - 当给不可访问(如私有或不存在)的属性赋值时调用,`$name` 是属性名,`$value` 是要赋的值。
    ```php
   

class MyClass {private $data = array();public function __set($name, $value) {$this->data[$name] = $value;}}$obj = new MyClass();$obj->nonExistentProperty = "value"; 


    ```
    - 给 `nonExistentProperty` 赋值时调用 `__set` 函数,可在此处自定义赋值逻辑。


### 序列化和反序列化
- **__sleep()**:
    - 当使用 `serialize()` 函数时,会调用 `__sleep()`,可以在序列化对象前做一些操作,比如清理对象或保存状态,返回一个包含需要序列化的属性名的数组。
    ```php
   

class MyClass {public $name;public $age;public function __sleep() {return array('name');}}$obj = new MyClass();$obj->name = "John";$obj->age = 30;$serialized = serialize($obj); 


    ```
    - 这里只序列化 `name` 属性,因为 `__sleep` 中只返回了 `name`。
- **__wakeup()**:
    - 当使用 `unserialize()` 函数时,会调用 `__wakeup()`,可以在此函数中重新建立数据库连接、初始化对象等。
    ```php
   

class MyClass {public $name;public function __wakeup() {$this->name = strtoupper($this->name);}}$serialized = 'O:7:"MyClass":1:{s:4:"name";s:4:"John";}';$obj = unserialize($serialized); 


    ```
    - 反序列化后,会调用 `__wakeup` 函数,将 `name` 属性的值转换为大写。


### 其他魔术函数
- **__toString()**:
    - 当对象被当作字符串使用时调用。
    ```php
   

class MyClass {public function __toString() {return "这是一个对象的字符串表示。";}}$obj = new MyClass();echo $obj; 


    ```
    - 当将 `$obj` 作为字符串输出时,会调用 `__toString` 函数。
- **__invoke()**:
    - 当尝试将对象作为函数调用时触发。
    ```php
   

 class MyClass {public function __invoke() {echo "对象被当作函数调用。";}}$obj = new MyClass();$obj(); 


    ```
    - 当像调用函数一样调用 `$obj` 时,会调用 `__invoke` 函数。


### 类的自动加载和克隆
- **__autoload($class_name)**:
    - 这是一个自动加载函数,当尝试使用未定义的类时会调用,可用于自动加载类文件,不过在 PHP 7.2.0 之后被弃用,推荐使用 `spl_autoload_register()` 函数。
    ```php
   

 function __autoload($class_name) {include $class_name.'.php';}$obj = new SomeClass(); 


    ```
    - 当创建 `SomeClass` 对象时,如果该类未被包含,会调用 `__autoload` 函数尝试加载 `SomeClass.php`。
- **__clone()**:
    - 当使用 `clone` 关键字克隆对象时调用,可用于复制对象的属性或进行其他复制操作。
    ```php
   

 class MyClass {public $name;public function __clone() {$this->name = "克隆对象:".$this->name;}}$obj = new MyClass();$obj->name = "Original";$clonedObj = clone $obj; 


    ```
    - 当克隆 `$obj` 时,会调用 `__clone` 函数修改克隆对象的属性。


PHP 魔术函数提供了强大的灵活性和功能扩展,让开发者可以更方便地处理对象的各种情况,但使用时需要注意其自动触发的特性,避免出现意外行为。

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

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

相关文章

目标检测新视野 | YOLO、SSD与Faster R-CNN三大目标检测模型深度对比分析

目录 引言 YOLO系列 网络结构 多尺度检测 损失函数 关键特性 SSD 锚框设计 损失函数 关键特性 Faster R-CNN 区域建议网络(RPN) 两阶段检测器 损失函数 差异分析 共同特点 基于深度学习 目标框预测 损失函数优化 支持多类别检测 应…

go chan底层分析

go chan底层分析 底层源码hchanmakechan 方法 环形队列阻塞机制向管道写数据流程图源码 从管道读数据流程图源码 关闭通道 底层源码 hchan type hchan struct {qcount uint // 当前队列中剩余元素个数dataqsiz uint // 环形队列长度,即可以…

【Git版本控制器--1】Git的基本操作--本地仓库

目录 初识git 本地仓库 认识工作区、暂存区、版本库 add操作与commit操作 master文件与commit id 修改文件 版本回退 撤销修改 删除文件 初识git Git 是一个分布式版本控制系统,主要用于跟踪文件的更改,特别是在软件开发中。 为什么要版本…

【C语言】_字符串拷贝函数strcpy

目录 1. 函数声明及功能 2. 使用示例 3. 注意事项 4. 模拟实现 4.1 第一版:基本功能判空const修饰 4.2 第二版:优化对于\0的单独拷贝 4.3 第三版:仿strcpy的char*返回值 1. 函数声明及功能 char * strcpy ( char * destination, cons…

AIGC时代:如何快速搞定Spring Boot+Vue全栈开发

文章目录 一、Spring Boot基础二、Vue.js基础三、Spring Boot与Vue.js集成四、性能优化与最佳实践《快速搞定Spring BootVue全栈开发》 内容简介作者简介目录前言/序言本书内容本书特点读者对象 随着人工智能生成内容(AIGC)技术的迅速发展,…

C语言结构体漫谈:从平凡中见不平凡

大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文《1》 结构体的两种声明一、结构…

lwip单网卡多ip的实现

1、今天要实现lwip的多个ip配置,本来以为需要自己修改很多核心代码 2、查阅资料才发现,lwip已经把接口留出来了 /** Define this to 1 and define LWIP_ARP_FILTER_NETIF_FN(pbuf, netif, type) * to a filter function that returns the correct neti…

MySQL NaviCat 安装及配置教程(Windows)【安装】

文章目录 一、 MySQL 下载 1. 官网下载2. 其它渠道 二、 MySQL 安装三、 MySQL 验证及配置四、 NaviCat 下载 1. 官网下载2. 其它渠道 五、 NaviCat 安装六、 NaviCat 逆向工程 软件 / 环境安装及配置目录 一、 MySQL 下载 1. 官网下载 安装地址:https://www.m…

HarmonyOS Next 实现登录注册页面(ARKTS) 并使用Springboot作为后端提供接口

1. HarmonyOS next ArkTS ArkTS围绕应用开发在 TypeScript (简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是TS的超集 ArkTS在TS的基础上扩展了struct和很多的装饰器以达到描述UI和状态管理的目的 以下代码是一个基于…

Web第一次作业

主页: <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>主页</title> </head> <body> <h1>你好&#xff01; 来到我的网站</h1> <p><a href"login…

大疆最新款无人机发布,可照亮百米之外目标

近日&#xff0c;DJI 大疆发布全新小型智能多光旗舰 DJI Matrice 4 系列&#xff0c;包含 Matrice 4T 和 Matrice 4E 两款机型。DJI Matrice 4E 价格为27888 元起&#xff0c;DJI Matrice 4T价格为38888元起。 图片来源&#xff1a;大疆官网 DJI Matrice 4E DJI Matrice 4T D…

掌握C语言内存布局:数据存储的智慧之旅

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 目录 引言正文一、数据类型介绍1.内置类型2.自定义…

图论的起点——七桥问题

普瑞格尔河从古堡哥尼斯堡市中心流过&#xff0c;河中有小岛两座&#xff0c;筑有7座古桥&#xff0c;哥尼斯堡人杰地灵&#xff0c;市民普遍爱好数学。1736年&#xff0c;该市一名市民向大数学家Euler提出如下的所谓“七桥问题”&#xff1a; 从家里出发&#xff0c;7座桥每桥…

ubuntu20.04安装MySQL5.7

deb安装 下载deb文件并配置 wget https://repo.mysql.com//mysql-apt-config_0.8.12-1_all.deb sudo dpkg -i mysql-apt-config_0.8.12-1_all.deb我使用xshell可以正常。 这个弹出框里&#xff0c;选择的是“ubuntu bionic”。(在终端工具上&#xff0c;有可能显示不了选项)【…

openharmony标准系统方案之瑞芯微RK3568移植案例

标准系统方案之瑞芯微RK3568移植案例 ​本文章是基于瑞芯微RK3568芯片的DAYU200开发板&#xff0c;进行标准系统相关功能的移植&#xff0c;主要包括产品配置添加&#xff0c;内核启动、升级&#xff0c;音频ADM化&#xff0c;Camera&#xff0c;TP&#xff0c;LCD&#xff0c…

【C语言】_求字符串长度函数strlen

目录 1. 函数声明及功能 2. 注意事项 3. 模拟实现 3.1 方式1&#xff1a;计数器方式 3.2 方式2&#xff1a;指针-指针方式 3.3 方式3&#xff1a;递归方式&#xff08;不创建临时变量计数器方式&#xff09; 4. strlen相关例题 1. 函数声明及功能 size_t strlen ( cons…

【大前端】Vue3 工程化项目使用详解

目录 一、前言 二、前置准备 2.1 环境准备 2.1.1 create-vue功能 2.1.2 nodejs环境 2.1.3 配置nodejs的环境变量 2.1.4 更换安装包的源 三、工程化项目创建与启动过程 3.1 创建工程化项目 3.2 项目初始化 3.3 项目启动 3.4 核心文件说明 四、VUE两种不同的API风格 …

微软开源AI Agent AutoGen 详解

AutoGen是微软发布的一个用于构建AI Agent系统的开源框架,旨在简化事件驱动、分布式、可扩展和弹性Agent应用程序的创建过程。 开源地址: GitHub - microsoft/autogen: A programming framework for agentic AI 🤖 PyPi: autogen-agentchat Discord: https://aka.ms/auto…

cursor重构谷粒商城02——30分钟构建图书管理系统【cursor使用教程番外篇】

前言&#xff1a;这个系列将使用最前沿的cursor作为辅助编程工具&#xff0c;来快速开发一些基础的编程项目。目的是为了在真实项目中&#xff0c;帮助初级程序员快速进阶&#xff0c;以最快的速度&#xff0c;效率&#xff0c;快速进阶到中高阶程序员。 本项目将基于谷粒商城…

[Qualcomm]Qualcomm MDM9607 SDK代码下载操作说明

登录Qualcomm CreatePoing Qualcomm CreatePointhttps://createpoint.qti.qua