php魔术方法整理

2016某知名互联网公司PHP面试题及答案 1 字符串”\r”,”\n”,”\t”,”\x20”分别代表什么答案: “\r”代表的含义是: 在Linux、unix 中表示返回到当行的最开始位置,在Mac OS 中表示换行且返回到下一行的最开始位置,相当于Windows 里的 \n 的效果。 “\n”代表的含义是: 在Windows 中表示换行且回到下一行的最开始位置。相当于Mac OS 里的 \r 的效果,在Linux、unix 中只表 阅读详情

__construct(), __destruct(), __call(), __callStatic(), __get(),__set(), __isset(), __unset(), __sleep(),__wakeup(), __toString(),__invoke(), __set_state(), __clone() 和 __debugInfo() 等方法在 PHP 中被称为"魔术方法"(Magic methods)。在命名自己的类方法时不能使用这些方法名,除非是想使用其魔术功能

PHP 将所有以 __(两个下划线)开头的类方法保留为魔术方法。所以在定义类方法时,除了上述魔术方法,建议不要以 __ 为前缀。

1、构造函数和西沟函数

(1)构造函数 __construct()

PHP 5 允行开发者在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作

如果子类中定义了构造函数则不会隐式调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用parent::__construct()。如果子类没有定义构造函数则会如同一个普通的类方法一样从父类继承(假如没有被定义为 private 的话);

(2)析构函数 __destruct()

PHP 5 引入了析构函数的概念,这类似于其它面向对象的语言,如 C++。析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。

和构造函数一样,父类的析构函数不会被引擎暗中调用。要执行父类的析构函数,必须在子类的析构函数体中显式调用 parent::__destruct()。此外也和构造函数一样,子类如果自己没有定义析构函数则会继承父类的。

析构函数即使在使用 exit() 终止脚本运行时也会被调用。在析构函数中调用 exit() 将会中止其余关闭操作的运行。

析构函数在脚本关闭时调用,此时所有的 HTTP 头信息已经发出。脚本关闭时的工作目录有可能和在 SAPI(如 apache)中时不同。

试图在析构函数(在脚本终止时被调用)中抛出一个异常会导致致命错误。

更多析构函数和构造函数相关请前往->构造函数和西沟函数

2、重载

PHP所提供的"重载"(overloading)是指动态地"创建"类属性和方法。我们是通过魔术方法(magic methods)来实现的。

当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用。

所有的重载方法都必须被声明为 public。

5.1.0 新增 __isset() 和 __unset() 两个魔术方法。

5.3.0 新增 __callStatic()魔术方法。可见性未设置为 public 或未声明为 static 的时候会产生一个警告。

Note:

这些魔术方法的参数都不能通过引用传递。PHP中的"重载"与其它绝大多数面向对象语言不同。传统的"重载"是用于提供多个同名的类方法,但各方法的参数类型和个数不同。

(1)属性重载

      public void __set ( string $name , mixed $value )

      public mixed __get ( string $name )

      public bool __isset ( string $name )

      public void __unset ( string $name )

在给不可访问属性赋值时,__set() 会被调用。

读取不可访问属性的值时,__get() 会被调用。

当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。

当对不可访问属性调用 unset() 时,__unset() 会被调用。

参数 $name 是指要操作的变量名称。__set() 方法的 $value 参数指定了 $name 变量的值。

属性重载只能在对象中进行。在静态方法中,这些魔术方法将不会被调用。所以这些方法都不能被 声明为 static。从 PHP 5.3.0 起, 将这些魔术方法定义为 static 会产生一个警告。

(2)方法重载

public mixed __call ( string $name , array $arguments )

public static mixed __callStatic ( string $name , array $arguments )

在对象中调用一个不可访问方法时,__call() 会被调用。

在静态上下文中调用一个不可访问方法时,__callStatic() 会被调用。

$name 参数是要调用的方法名称。$arguments 参数是一个枚举数组,包含着要传递给方法 $name 的参数。

更多重载相关请前往-->重载

3、对象复制

在多数情况下,我们并不需要完全复制一个对象来获得其中属性。但有一个情况下确实需要:如果你有一个 GTK 窗口对象,该对象持有窗口相关的资源。你可能会想复制一个新的窗口,保持所有属性与原来的窗口相同,但必须是一个新的对象(因为如果不是新的对象,那么一个窗口中的改变就会影响到另一个窗口)。还有一种情况:如果对象 A 中保存着对象 B 的引用,当你复制对象 A 时,你想其中使用的对象不再是对象 B 而是 B 的一个副本,那么你必须得到对象 A 的一个副本。

对象复制可以通过 clone 关键字来完成(如果可能,这将调用对象的 __clone() 方法)。对象中的 __clone() 方法不能被直接调用。

$copy_of_object = clone $object;

当对象被复制后,PHP 5 会对对象的所有属性执行一个浅复制(shallow copy)。所有的引用属性 仍然会是一个指向原来的变量的引用。

当复制完成时,如果定义了 __clone() 方法,则新创建的对象(复制生成的对象)中的 __clone() 方法会被调用,可用于修改属性的值(如果有必要的话)。

更多对象复制请前往-> 对象复制

4、剩余的魔术方法

 (1)__sleep() 和__wakeup()

public array __sleep ( void )

void __wakeup ( void )

__sleep() 方法常用于提交未提交的数据,或类似的清理操作。同时,如果有一些很大的对象,但不需要全部保存,这个功能就很好用。

与之相反,unserialize() 会检查是否存在一个 __wakeup() 方法。如果存在,则会先调用 __wakeup 方法,预先准备对象需要的资源。

__wakeup() 经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。

Note:

__sleep() 不能返回父类的私有成员的名字。这样做会产生一个 E_NOTICE 级别的错误。可以用 Serializable 接口来替代。

serialize() 函数会检查类中是否存在一个魔术方法 __sleep()。如果存在,该方法会先被调用,然后才执行序列化操作。此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。如果该方法未返回任何内容,则 NULL 被序列化,并产生一个 E_NOTICE 级别的错误

(2)__toString()

public string __toString ( void )

__toString() 方法用于一个类被当成字符串时应怎样回应。例如 echo $obj; 应该显示些什么。此方法必须返回一个字符串,否则将发出一条E_RECOVERABLE_ERROR 级别的致命错误。

(3) __invoke()

mixed __invoke ([ $... ] )

当尝试以调用函数的方式调用一个对象时,__invoke()方法会被自动调用。

Note: 本特性只在 PHP 5.3.0 及以上版本有效。

(4) __set_state()

static object __set_state ( array $properties )

自 PHP 5.1.0 起当调用 var_export() 导出类时,此静态 方法会被调用。

本方法的唯一参数是一个数组,其中包含按 array('property' => value, ...) 格式排列的类属性。

(5) __debuginfo()

arrray __debuginfo( void )

在转储对象以获得应该显示的属性时,var_dump()调用此方法。如果该方法没有在对象上定义,那么将显示所有公共、受保护和私有属性。

php5.6以后支持此特性

以上4相关的魔术方法的详细解释和例子请前往 魔术方法

 

 

老司机避坑指南:UC3842自举驱动电路发热严重?这样选C39/C37电容值最稳 本文针对UC3842自举驱动电路发热严重的问题,深入剖析了驱动波形边沿速度与损耗的矛盾根源。通过实测数据与热成像分析,重点阐述了关键电容C39/C37的选型策略,提供了从经验公式到量化计算的优化方法,帮助工程师在发热与效率间找到最佳平衡点,并探讨了分立方案与专用驱动IC的适用场景。 阅读详情

相关推荐

5分钟搞懂MSDNet:用Transformer实现小样本语义分割的保姆级教程

本文详细介绍了MSDNet(Multi-Scale Decoder Network)如何利用Transformer架构实现小样本语义分割。通过多尺度解码器和空间Transformer解码器,MSDNet能够在仅有1-5张标注图像的情况下完成精确分割任务。文章提供了PyTorch代码实例和优化技巧,帮助开发者快速掌握这一前沿技术。

weixin_30832143的博客 506

PHP之十六个魔术方法详解

PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods),这些方法在PHP中充当了举足轻重的作用。

荒的博客 4592

基于EtherCAT的AM402与SV660N、IS620N伺服运动控制实战指南

本文详细介绍了基于EtherCAT总线的汇川AM402 PLC与SV660N、IS620N伺服驱动器构建运动控制系统的完整实战流程。内容涵盖硬件平台搭建、软件组态、关键参数设置、InoProShop编程及调试技巧,旨在帮助工程师快速掌握这一高精度、高响应的工业自动化解决方案。

weixin_29204205的博客 400

PHP之魔术方法

ctf常用的魔术方法

errorr0 7441

NVIDIA Jetson AGX Xavier设置风扇转速、工作模式及性能监控

Xavier的风扇在开机之后是默认关闭的,每次重启都需要手动打开风扇,后续可能考虑修改bashrc文件进行自动开启 这个是显示当前风扇的转速,默认应该是0,表示关闭,最大是250 cat /sys/devices/pwm-fan/target_pwm 可以通过修改该文件的值来修改风扇转速 vim /sys/devices/pwm-fan/target_pwm 我一般使用的是100这个值 作者:ryan_ren 链接:https://www.jianshu.com/p/d3c2041f7f7d 来源:简书 著

weixin_43877080的博客 1万+

风二西CTF流量题大集合-刷题笔记|基础题(1)

部分题目已包含脚本和解题视频,但更建议自行分析和手搓脚本。

zerorzeror的博客 2764

php 之魔术方法详解

面向对象的基础是学好魔术方法

国内某知名游戏公司小菜鸡工程师 7834

Claude桌面端安装失败?Retrying无限重试终极解决方案(亲测有效)

Claude桌面端安装卡在Retrying并非网络问题,而是安装器下载源异常导致。本文提供已验证方案:一条命令即可解决问题🚀

XiaoqiangClub的博客 2332

php中魔术方法详解

PHP魔术方法详解 php中魔术方法详解,在php中有一类方法,很奇怪常,那就是只要满足一定条件,就会自己执行,那就是php中的魔术方法,码字不易,出精品更难,没有特别幸运,那么请先特别努力,别因为懒惰而失败,还矫情地将原因归于自己倒霉。你必须特别努力,才能显得毫不费力。如果这篇文章能给你带来一点帮助,希望给飞兔小哥哥一键三连,表示支持,谢谢各位小伙伴们。 目录 一、__construct构造方法 二、 __destruct析构方法 三、 __clone克隆方法 四、__ca

陌潇 3771

RK3568笔记二:部署手写数字识别模型

部署手写数字识别模型,使用手写数字识别(mnist)数据集训练了一个 LENET 的五层经典网络模型。Lenet是我们的深度学习入门的必学模型,是深度学习领域中的经典卷积神经网络(CNN)架构之一。过程分为:训练,导出ONNX,转化RKNN,测试。

1169

基于STM32的智能婴儿床设计(蓝牙通信+摄像头监控)_315

本项目设计并实现了一款基于STM32微控制器的智能婴儿床系统,通过多种传感器和智能控制模块为家长提供更便捷和高效的婴儿照护解决方案。系统包括婴儿哭泣检测、湿度监测、空气质量检测、温度监控等多项功能,并通过蓝牙与手机APP进行数据传输和远程控制。婴儿床内置摇摇床和安抚音乐播放功能,能够在婴儿哭泣时自动启动摇摇床并播放安抚音乐。此外,系统还支持摄像头远程监控,让家长实时查看婴儿的状态。整个系统采用STM32F103RCT6作为核心控制单元,结合声音传感器、湿度传感器、MQ135空气质量传感器。

863

PHP魔术方法详解

PHP魔术方法总结概括

2302_79800344的博客 1290

最新Python爬虫实战(入门爬虫篇)——案例13:某乎热榜数据采集(详细爬虫思路截图+抓包动图演示+完整爬虫代码+详细注释)

本次案例通过Python爬虫技术,成功实现了基于Cookies认证的某乎热榜数据爬取与Excel保存。代码采用模块化设计,包含Cookies解析、HTML请求、结构化解析、Excel持久化等完整流程;通过配置浏览器请求头+Cookies认证,有效突破某乎基础反爬策略,保证请求稳定性。整个爬虫逻辑遵循“Cookies认证 → 页面请求 → HTML解析 → 数据清洗 → 保存到Excel”的标准流程,与需要会话验证的网站爬取范式高度一致。Cookies解析与认证。

努力让自己发光,对的人才能迎着光而来 33万+

php反序列化常见魔术方法整理

整理php反序列化代码审计中常见的可用魔术方法

2302_79590880的博客 979

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

归纳整理php中的魔术方法

一文看懂PHP的十四个魔术方法的使用。

zealzone88的博客 296

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

php __call 魔术方法 整理

<?phpfunction func (){    echo 'function func';echo "<br/>";}class Cache{         /**     * 当 调用的方法不存在时 会调用此方法     * 配合 call_user_func     * @param unknown $method     * @param array $args   ...

伊之仲的博客 470

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

2019年PHP面试题整理

嘎嘎嘎嘎嘎

盼盼蜗牛的博客 3808

高级php面试题及答案,高级php面试题及部分答案

在网上看到一些高级php 的面试题目。。闲来无事,搞了一些答案。。。可能不是很全面,留这以后备用吧。一. 基本知识点1.1 HTTP协议中几个状态码的含义:503 500 401 403 404 200 301 302。。。200 : 请求成功,请求的数据随之返回。301 : 永久性重定向。302 : 暂时行重定向。401 : 当前请求需要用户验证。403 : 服务器拒绝执行请求,即没有权限。40...

weixin_29920697的博客 3343

PHP 面试知识点整理归纳

全文已整理补充完毕,以后还会继续更新文章里面的错误,以及补充尚不完善的问题。 该篇文章是针对Github上wudi/PHP-Interview-Best-Practices-in-China资源的答案个人整理 lz也是初学者,以下知识点均为自己整理且保持不断更新,也希望各路大神多多指点,若发现错误或有补充,可直接comment,lz时刻关注着。 由于内容比较多,没有直接目录,请自行对照 Gi...

PHP学习日志——地雷 1万+

PHP---面试题

1、PHP函数,二维数组排序 PHP一维数组的排序可以用sort(),asort(),arsort()等函数。 二维数组排序,array_multisort() 函数返回排序数组。您可以输入一个或多个数组。 2、1000个a.php和b.php正在运行,如何杀掉1000个a.php不影响b.php? pkill 正在运行的程序名 3、如何知道一个文件有多少行? ①使用file方法一次...

小熊猫的博客 488

整理收藏一份PHP高级工程师的笔试题

整理了一份PHP高级工程师的笔试题,问题很全面。嗯,基本上这些题都答得不错,那么你应该可以胜任大部分互联网企业的PHP职位了。下面直接上题。 1. 基本知识点 HTTP协议中几个状态码的含义:503,500,401,200,301,302。。。 include,require,i...

chepabei0455的博客 137

php基础部分

php学习至今一年有余,笔记积累挺多的,也挺杂的,写篇文章整理一下吧。 php基础部分 PHP 输出文本的基础指令:echo 和 print。 echo和print的区别 echo是PHP语句, print和print_r是函数,语句没有返回值,函数可以有返回值(即便没有用) echo 输出一个或者多个字符串。 print 只能打印出简单类型变量的值(如int,string)

u010401880的专栏 674

提高PHP性能的12条忠告

在Zend的会议上著名的PHP专家 Ilia Alshanetsky发表了 PHP performance talk,文章很实用,这里我整理了其中一部分,总结了12条关于提高PHP性能的忠告。 1.如果一个方法可以定义为static,一定要定位static,性能提高系数4. 2.避免使用__get,__set,__autoload 3.require_once()执行代价

sailrancho的专栏 757

面试题整理

好荣幸能够收到淘宝的面试通知,这里整理下php相关的面试题,不管难易,加深下自己的记忆1,post和get传值的区别。主要区别是,get是通过地址栏传值,大小限制在2kb,post一般通过表单传值,默认是不限制数据大小。get传值效率要比post高,但是安全性上post要好很多。Get方式提交的参数及参数值会在地址栏显示,不安全,而Post不会,比较安全2,include和re...

weixin_30257433的博客 76

php中高级面试题

近来看了许多PHP面试题,有的题目有答案,有的没有。还是决心全部记录一下,部分答案是借鉴网上的资料,部分是自己总结。有的题目可能有冗余,答案不是很细化,就当作自己熟练题目,另外,也可以让大家借鉴,哪里总结的不完整或不正确,还望指正。 1. Mysql常用优化方法有哪些,请尽可能列出? 答:选取合适的字段属性 ; 尽量把字段设置为not null...

Dalang-kexin 1069

PHP进阶知识总结

周末梳理了下这段时间看书的一些知识点,进步的过程不仅要实践,还要安排多看书、思考、总结。 只针对知识点进行了罗列和简单说明,很多细节还未整理好,待后面再专门详细写。 基础易忽略概念 PHP是一个支持面向对象开发的语言,而不是一个纯面向对象的语言 PHP5中保留了对var的支持,但会将var自动转换为public 类型检查函数: is_bool() is_integ...

weixin_30391339的博客 153
下一篇: web攻击方式 介绍
han_code
博客等级 码龄9年 5粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值