首页 > 编程语言 >PHP魔法方法之__sleep()方法和__wakeup()方法

PHP魔法方法之__sleep()方法和__wakeup()方法

时间:2023-02-07 14:38:13浏览次数:56  
标签:__ 调用 sleep connect wakeup 序列化 方法


  • public array __sleep ( void )
  • void __wakeup ( void )

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

​__sleep()​​不可能返回父类的私有属性,这样做会导致一个E_NOTICE的错误

​__sleep()​​​方法常用于提交未提交的数据,或类似的清理操作。同时,如果你有一些很大的对象, 不需要全部保存,这个功能就很好用。与之相反,​​unserialize()​​​会检查是否存在一个​​__wakeup()​​方法。如果存在,则会先调用 __wakeup方法,预先准备对象需要的资源。

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

代码例子:

 

< meta http - equiv = "Content-Type" content = "text/html; charset=utf-8" >
<?php
class Connection
{
protected $link ;
private $server , $username , $password , $db ;

public function __construct ( $server , $username , $password , $db )
{
$this -> server = $server ;
$this -> username = $username ;
$this -> password = $password ;
$this -> db = $db ;
$this -> connect ( ) ;
}

private function connect ( )
{
print "function connect().<br>" ;
$this -> link = mysql_connect ( $this -> server , $this -> username , $this -> password ) ;
mysql_select_db ( $this -> db , $this -> link ) ;
}
/** * * serialize() 函数会检查是否存在一个魔术方法 __sleep(). * 如果存在,__sleep()方法会先被调用, 然后才执行序列化操作。 * 这个功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。 * 如果该方法不返回任何内容,则NULL被序列化,并产生 一个E_NOTICE错误。 */
public function __sleep ( )
{
print "Magic methods__sleep().<br>" ;
return array ( 'server' , 'username' , 'password' , 'db' ) ;
}

/** * unserialize()会检查是否存在一个__wakeup()方法。 * 如果存在,则会先调用 __wakeup方法,预先准备对象需要的资源 * 注意:这里说的“对象需要的资源”,并不是说对象的属性等状态 * 这些状态在调用__wakeup之前已经存在,__wakeup只是做一些数据库连接等操作 */
public function __wakeup ( )
{
print "in methods wakeup before connect, " . $this -> server . "<br>" ;
print "Magic methods__wakeup().<br>" ;
$this -> connect ( ) ;
print "in methods wakeup after connect, " . $this -> server . "<br>" ;
}
}

//以下两个代码块,先执行第一块,再执行第二块
/*$conn = new Connection('127.0.0.1', 'root', 'root', 'text'); $ss = serialize($conn); $file = fopen('obj.txt', 'w'); fwrite($file,$ss); */
$file = fopen ( 'obj.txt' , 'r' ) ;
$ss = fread ( $file , filesize ( 'obj.txt' ) ) ;
$conn = unserialize ( $ss ) ;

?>

第一段(序列化)的执行结果:

function connect().
Magic methods__sleep().

同时,obj.txt里面是序列化的对象字符串

第二段(反序列化的)执行解雇:

in methods wakeup before connect, 127.0.0.1
Magic methods__wakeup().
function connect().
in methods wakeup after connect, 127.0.0.1

总结:魔法方法是在某一个时刻,被自动调用的函数,类似于操作符重载,这里的sleep发生在序列化之前,wake发生在反序列化之前。

PHP其他一些魔法方法:

__destruct()当删除一个对象或对象操作终止的时候调用该方法

__get()当试图读取一个并不存在的属性的时候被调用

__set()当试图向一个并不存在的属性写入值的时候被调用

__call()当试图调用一个对象并不存在的方法时调用该方法

__toString()当打印一个对象的时候被调用

__clone()当对象被克隆时被调用

__sleep()当对象被串行化时调用

__wakeup()当对象被反串行化时调用

__invoke()在代码试图把对象当作函数来使用时候调用

__autoload()简单的说就是类的自动加载

 

__LINE__文件中的当前行号

__FILE__文件的完整路径和文件名

__DIR__文件所在的目录

__FUNCTION__函数名称

__CLASS__类的名称

__METHOD__类的方法名

__NAMESPACE__当前命名空间的名称

标签:__,调用,sleep,connect,wakeup,序列化,方法
From: https://blog.51cto.com/peishuai/6042073

相关文章

  • 我是如何用CAP和BASE两个基础理论卷死其他组员的?
    本文内容整理自博学谷狂野架构师​ CAP定理又被称作布鲁尔定理,是加州大学的计算机科学家布鲁尔在2000年提出的一个猜想。2002年,麻省理工学院的赛斯·吉尔伯特和南......
  • 个人博客SEO第一步-提交自己的网站
    很多个人博客博主,不知道该怎么推广,也不懂专业的SEO推广技术。其实最直接的第一步,就是要告诉互联网,有了你这个站点,因此,先要向网络上各大网站服务商、各大搜索引擎、各大博客......
  • 每天提醒自己认真工作的软件有哪些
    过了元宵节之后,大多数的上班族都要开始收心工作了。相信很多职场人士在重返工作岗位的时候,都抱着一定要认真工作,在新的一年升职加薪的想法,但是在工作了几天之后就开始“三......
  • 如何检查文件是否有Python的符号链接
    1、对于python3.4及更高版本,可以使用Path类。frompathlibimportPath#rpdisasymboliclink>>>Path('rdp').is_symlink()True>>>Path('README').is_symlink()False2......
  • ubuntu22.04 git升级
     git--version //查看版本 sudoadd-apt-repositoryppa:git-core/ppa  //通过PPA源方式安装软件的添加PPA源到Sourcelist中的命令,新手可以了解一下ubuntu专用......
  • 报表生成器 FastReport .Net 用户指南 2023(三):配置Bands
    FastReport.Net是一款全功能的WindowsForms、ASP.NET和MVC报表分析解决方案,使用FastReport.NET可以创建独立于应用程序的.NET报表,同时FastReport.Net支持中文、英语等14......
  • 手机微信聊天记录怎么打印出来?
    微信是绝大多数人最常用的聊天工具软件之一,无论是家人、朋友、同事,还是老师和家长都会使用微信来沟通和交流。而有不少网友想要找某件事情的记录时,也会使用微信来搜索聊天......
  • 数据采集技术之在Python中Libxml模块安装与使用XPath
    为了使用XPath技术,对爬虫抓取的网页数据进行抽取(如标题、正文等等),之后在Windows下安装libxml2模块(安装后使用的是Libxml模块),该模块含有xpath。准备需要的软件包:Python2.7......
  • Scaffold-DbContext使用教程
    1.基础准备   安装对应的三个nuget包,第二个nuget由你使用数据库决定 2.命令说明 Scaffold-DbContext为DbContext数据库的和实体类型生成代码。为了使Sca......
  • python静态web服务器如何实现
    1、编写TCP服务器程序。2、获取浏览器发送的http请求消息数据。3、读取固定的页面数据,将页面数据组装成HTTP响应消息数据并发送给浏览器。4、HTTP响应报文数据发送完成后,关......