PHP魔术方法详解

php魔术方法是一些特殊的方法,由特定的环境来进行触发。

这些魔术方法让开发者能够更好地控制对象的行为,特别是在处理不常见的操作或者需要自动化处理某些任务时非常有用。


1、_construct()构造函数:

<?php
highlight_file(__FILE__);
class User {public $username;public function __construct($username) {$this->username = $username;echo "触发了构造函数1次" ;}
}
$test = new User("benben");
$ser = serialize($test);
unserialize($ser);?> 

_construct()构造函数,在创建实例化对象时自动调用。


2、_destruct()析构函数:

class User {public function __destruct(){echo "触发了析构函数1次"."<br />" ;}
}
$test = new User("benben");
$ser = serialize($test);
unserialize($ser);

_destruct()函数,在销毁对象时自动调用。


3、sleep()函数:

class User {const SITE = 'uusama';public $username;public $nickname;private $password;public function __construct($username, $nickname, $password)    {$this->username = $username;$this->nickname = $nickname;$this->password = $password;}public function __sleep() {return array('username', 'nickname');}
}
$user = new User('a', 'b', 'c');
echo serialize($user); 

_sleep()函数在对象被序列化时调用。


4、_wakeup()函数:

<?php
highlight_file(__FILE__);
error_reporting(0);
class User {const SITE = 'uusama';public $username;public $nickname;private $password;private $order;public function __wakeup() {$this->password = $this->username;}
}
$user_ser = 'O:4:"User":2:{s:8:"username";s:1:"a";s:8:"nickname";s:1:"b";}';
var_dump(unserialize($user_ser));
?> 

_wakeup()函数在对象被反序列化时调用。


5、_toString()函数:

<?php
highlight_file(__FILE__);
error_reporting(0);
class User {var $benben = "this is test!!";public function __toString(){return '格式不对,输出不了!';}
}
$test = new User() ;
print_r($test);
echo "<br />";
echo $test;
?> 

_toString()函数在将对象转化为字符串时调用。


6、invoke()函数:

<?php
highlight_file(__FILE__);
error_reporting(0);
class User {var $benben = "this is test!!";public function __invoke(){echo  '它不是个函数!';}
}
$test = new User() ;
echo $test ->benben;
echo "<br />";
echo $test() ->benben;
?> 

_invoke()函数在将实例化对象test当作test()函数时调用。


7、_call()函数:

<?php
highlight_file(__FILE__);
error_reporting(0);
class User {public function __call($arg1,$arg2){echo "$arg1,$arg2[0]";}
}
$test = new User() ;
$test -> callxxx('a');
?> 

在对象调用一个不存在的·参数和方法时使用。


8、_callStatic()函数:

<?php
highlight_file(__FILE__);
error_reporting(0);
class User {public function __callStatic($arg1,$arg2){echo "$arg1,$arg2[0]";}
}
$test = new User() ;
$test::callxxx('a');
?> 

在以静态方式调用一个不可调用的方法时使用。


9、_set()函数:

<?php
highlight_file(__FILE__);
error_reporting(0);
class User {public $var1;public function __set($arg1 ,$arg2){echo  $arg1.','.$arg2;}
}
$test = new User() ;
$test ->var2=1;
?> 

给类中不存在的成员属性赋值时使用。


10、_get()函数:

<?php
highlight_file(__FILE__);
error_reporting(0);
class User {public $var1;public function __get($arg1){echo  $arg1;}
}
$test = new User() ;
$test ->var2;
?> 

调用类中不存在的属性时使用。


11、isset()函数:

<?php
highlight_file(__FILE__);
error_reporting(0);
class User {private $var;public function __isset($arg1 ){echo  $arg1;}
}
$test = new User() ;
isset($test->var);
?> 

在使用isset()函数检查类中不可访问的属性是否存在时使用。


12、_unset()函数:

<?php
highlight_file(__FILE__);
error_reporting(0);
class User {private $var;public function __unset($arg1 ){echo  $arg1;}
}
$test = new User() ;
unset($test->var);
?> 

在对不可访问的属性使用unset()时使用。


13、_clone()函数:

<?php
highlight_file(__FILE__);
error_reporting(0);
class User {private $var;public function __clone( ){echo  "__clone test";}
}
$test = new User() ;
$newclass = clone($test)
?> 

使用clone关键字拷贝克隆一个对象后,新对象会自动调用。

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

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

相关文章

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:SideBarContainer)

提供侧边栏可以显示和隐藏的侧边栏容器&#xff0c;通过子组件定义侧边栏和内容区&#xff0c;第一个子组件表示侧边栏&#xff0c;第二个子组件表示内容区。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起…

硬件工程师入门基础知识(六)硬件工程师常用软件工具简单介绍

硬件工程师常用软件工具简单介绍 1.EDA工具1.1 Cadence1.2 pads1.3 Altium Designer2.电路仿真软件2.1 multisim2.2 LTspice2.3 MATLAB2.4 Cadence PSpice3.FPGA开发工具3.1 Xilinx Vivado3.2 Altera Quartus4.3D建模软件

如何通过物联网技术实现生产过程的智能化管理和优化

物联网技术在实现生产过程的智能化管理和优化方面扮演了至关重要的角色。以下是物联网技术如何发挥作用的具体方式&#xff1a; 实时监控与数据采集&#xff1a;通过在生产线上部署大量的传感器和设备&#xff0c;物联网技术可以实时收集生产设备的状态、环境参数以及产品的实…

《LeetCode热题100》笔记题解思路技巧优化_Part_4

《LeetCode热题100》笔记&题解&思路&技巧&优化_Part_4 &#x1f60d;&#x1f60d;&#x1f60d; 相知&#x1f64c;&#x1f64c;&#x1f64c; 相识&#x1f622;&#x1f622;&#x1f622; 开始刷题二叉树&#x1f7e2;1. 二叉树的中序遍历&#x1f7e2;2.…

C#八皇后算法:回溯法 vs 列优先法 vs 行优先法 vs 对角线优先法

目录 1.八皇后算法&#xff08;Eight Queens Puzzle&#xff09; 2.常见的八皇后算法解决方案 &#xff08;1&#xff09;列优先法&#xff08;Column-First Method&#xff09;&#xff1a; &#xff08;2&#xff09;行优先法&#xff08;Row-First Method&#xff09;&a…

【计算机网络_应用层】https协议——加密和窃密的攻防

文章目录 1.https协议的介绍2. 加密和解密2.1 什么是加密2.2 常见的加密方式2.2.1 对称加密2.2.2 非对称加密 2.3 数据摘要&#xff08;数据指纹&#xff09;2.4 数字签名 3. https协议的加密和解密方案一&#xff1a;使用对称加密&#xff08;❌&#xff09;方案二&#xff1a…

Cesium模拟真实湖泊效果

1. 实现效果 2.实现方法 官方文档 Cesium的material中提供了水water的相关材质&#xff1a;传送门 详细代码&#xff1a; const getWater (data) > {// 根据几何实例创建贴地面图元waterPrimitive new Cesium.GroundPrimitive({geometryInstances: new Cesium.GeometryIn…

2024年腾讯云免费服务器申请入口,个人和企业均可申请

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM&#xff0c;轻量配置可选2核2G3M、2核8G7M和4核8G12M&#xff0c;CVM云服务器可选2核2G3M和2核4G3M配置&#xff0c;腾讯云服务器网txyfwq.com分享2024年最新腾讯云免费…

基于单片机的DDS函数信号发生器

单片机DDS函数信号发生器设计 该设计以AT89S52为主控芯片&#xff0c;通过控制高性能DDS&#xff08;直接数字频率合成&#xff09;芯片AD9834产生不同频率的信号&#xff0c;经过6阶巴特沃兹低通滤波电路&#xff0c;连接数字电位器的运算放大电路&#xff0c;输出信号。可以…

理解接口,

关键点 接口可抽象出重要的行为标准&#xff08;用抽象方法来表示&#xff09;。 可以把实现接口的类的对象的引用赋值给接口变量&#xff0c;体 现该类根据接口里的行为标准给出具体行为。 ~接口的思想~&#xff1a;可以要求某些类&#xff08;类的父类可不同&#xff09;有…

监视和内存观察

监视和内存观察 5.监视和内存观察5.1 监视5.2 内存 5.监视和内存观察 在调试的过程中我们&#xff0c;如果要观察代码执行过程中&#xff0c;上下文环境中的变量的值&#xff0c;有哪些方法呢&#xff1f; 这些观察的前提条件一定是开始调试后观察&#xff0c;比如&#xff1…

Python小白笔记

输入 # 一行输入多个数字&#xff0c;空格隔开&#xff0c;存入列表a中 a list(map(int, input().split())) print(a) >>>21 22 34 54 67 >>>[21, 22, 34, 54, 67] 输出 数据&#xff1a; print(%d%10.3f%(x,y)) y的精度为3&#xff0c;宽度为10 %0 …

python中pyinstaller打包带资源的程序-pgzreo

本文使用创作助手。 PyInstaller是一个用于将Python脚本打包成可执行文件的工具。它可以将Python脚本、模块和依赖库打包成独立的可执行文件&#xff0c;方便在没有安装Python解释器的环境中运行。下面是PyInstaller的详细用法&#xff1a; 安装PyInstaller&#xff1a; 使用p…

Oracle 部署及基础使用

1. Oracle 简介 Oracle Database&#xff0c;又名 Oracle RDBMS&#xff0c;简称 Oracle Oracle系统&#xff0c;即是以Oracle关系数据库为数据存储和管理作为构架基础&#xff0c;构建出的数据库管理系统。是目前最流行的客户/服务器&#xff08;client/server&#xff09;或…

SpringTask实现的任务调度与XXL-job实现的分布式任务调度【XXL-Job工作原理】

目录 任务调度 分布式任务调度 分布式任务调度存在的问题以及解决方案 使用SpringTask实现单体服务的任务调度 XXL-job分布式任务调度系统工作原理 XXL-job系统组成 XXL-job工作原理 使用XXL-job实现分布式任务调度 配置调度中心XXL-job 登录调度中心创建执行器和任务 …

测试用例要如何写

1、测试点与测试用例 测试点不等于测试用例&#xff0c;这是我们首先需要认识到的。 问题1&#xff1a;这些测试点在内容上有重复&#xff0c;存在冗余。 问题2&#xff1a;一些测试点的测试输入不明确&#xff0c;不知道测试时要测试哪些。 问题3&#xff1a;总是在搭相似…

【pynput】监控是否打开百度贴吧网页

文章目录 简介Demo 简介 有网友提过一个要求&#xff0c;用 Python 实现一个 电脑打开某网站就自动关机的功能。 想到的思路有两个&#xff1a; 【windows 平台】, 获取活动的窗口标题&#xff0c;如果标题里包含了某些网站名称, 那就使用关机命令 可以定时拉取标题, 也可以使…

滑块验证码

1.这里针对滑块验证给了一个封装的组件verifition&#xff0c;使用直接可以调用 2.组件目录 3.每个文件的内容 3.1 Api文件中只有一个index.js文件&#xff0c;用来存放获取滑块和校验滑块结果的api import request from /router/axios//获取验证图片 export function reqGe…

Docker出现容器名称重复如何解决

假如你的重复容器名称是mysql5 删除已存在的容器&#xff1a;如果你不再需要那个已经存在的名为“mysql5”的容器&#xff0c;你可以删除它。使用下面的命令&#xff1a; docker rm -f mysql5这条命令会强制删除正在运行的容器。一旦容器被删除&#xff0c;你就可以重新使用这个…

Java 面向对象(类与对象 成员方法 方法重载 可变参数 构造方法 / 构造器 this关键字 包 访问修饰符)

目录 一、类与对象1. 类与对象的定义2. 类和对象的内存分配机制 二、成员方法1. 成员方法的定义2. 方法的调用机制3. 成员方法传参机制 三、方法重载四、可变参数1. 基本概念2. 基本语法3. 应用 五、 构造方法 / 构造器1. 特点2. 使用案例3. 对象创建的流程 六、this关键字1. 运…