从php5以后的版本,类就可以使用魔术方法了。php规定以两个下划线(__)开头的方法都保留为魔术方法,所以建议大家函数名最好不用__开 头,除非是为了重载已有的魔术方法。

目前php已有的魔术方法有 __construct,__destruct,__call,__get,__set,__isset,__unset,__sleep,__wakeup,__toString,__set_state 和 __clone。

下面说说php魔术方法中的__sleep __wakeup:

串行化serialize可以把变量包括对象,转化成连续bytes数据. 你可以将串行化后的变量存在一个文件里或在网络上传输. 然后再反串行化还原为原来的数据. 你在反串行化类的对象之前定义的类,PHP可以成功地存储其对象的属性和方法. 有时你可能需要一个对象在反串行化后立即执行. 为了这样的目的,PHP会自动寻找__sleep和__wakeup方法.

当一个对象被串行化,PHP会调用__sleep方法(如果存在的话). 在反串行化一个对象后,PHP 会调用__wakeup方法. 这两个方法都不接受参数. __sleep方法必须返回一个数组,包含需要串行化的属性. PHP会抛弃其它属性的值. 如果没有__sleep方法,PHP将保存所有属性.

在程序执行前,serialize() 函数会首先检查是否存在一个魔术方法 __sleep.如果存在,__sleep()方法会先被调用,

然后才执行串行化(序列化)操作。这个功能可以用于清理对象,并返回一个包含对象中所有变量名称的数组。如果该方法不返回任何内容,则NULL被序列化,导致

一个E_NOTICE错误。与之相反,unserialize()会检查是否存在一个__wakeup方法。如果存在,则会先调用

__wakeup方法,预先准备对象数据。

__sleep方法常用于提交未提交的数据,或类似的操作。同时,如果你有一些很大的对象,

不需要保存,这个功能就很好用。__wakeup经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。

server = $server;

$this->username = $username;

$this->password = $password;

$this->db = $db;

$this->connect();

}

private function connect()

{

$this->link = mysql_connect($this->server, $this->username, $this->password);

mysql_select_db($this->db, $this->link);

}

public function __sleep()

{

return array('server', 'username', 'password', 'db');

}

public function __wakeup()

{

$this->connect();

}

}

?>

下面例子显示了如何用__sleep和 __wakeup方法来串行化一个对象. Id属性是一个不打算保留在对象中的临时属性. __sleep方法保证在串行化的对象中不包含id属性. 当反串行化一个User对象,__wakeup方法建立id属性的新值. 这个例子被设计成自我保持. 在实际开发中,你可能发现包含资源(如图像或数据流)的对象需要这些方法。

id = uniqid();

}

function __sleep() { //此处不串行化id成员

return(array('name'));

}

function __wakeup() {

$this->id = uniqid();

}

}

$u = new user();

$u->name = "Leo";

$s = serialize($u); //serialize串行化对象u,此处不串行化id属性,id值被抛弃

$u2 = unserialize($s); //unserialize反串行化,id值被重新赋值

//对象u和u2有不同的id赋值

print_r($u);

print_r($u2);

?>

例三:__wakeup方法的一个缺陷需要注意,如果你打算unserialize一个对象,你

name);

}

}

$a = new A();

$a->name = "foo";

$a->b = new B();

//我们期望这里输出:foo,但实际在后面的代码执行之后,实际输出NULL.

$a->b->parent = $a;

$s = serialize($a);

$a = unserialize($s);

?>

原因: $b 对象在$name之前unserialized了. 所以在B::__wakeup执行时, $a->name还没有被赋值

所以,一定要小心你定义类中变量的执行顺序。

以上就介绍了PHP 魔术方法: __sleep __wakeup,包括了PHP 魔术方法方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

php 魔术方法 sleep,PHP 魔术方法: __sleep __wakeup相关推荐

  1. php5的魔术方法,php5中魔术方法学习笔记

    1.__construct() 当实例化一个对象的时候,这个对象的这个方法首先被调用. PHP实例代码如下: classTest {function__construct() {echo"b ...

  2. php魔术方法例子,PHP魔术方法示例

    ① __get/__set:将对象的属性进行接管 当访问一个不存在的对象属性时: index.php define('BASEDIR',__DIR__); //定义根目录常量 include BASE ...

  3. invoke 魔术_PHP常用魔术方法(__invoke魔术方法)

    PHP5.3魔术方法 __invoke 这个魔幻方法被调用的时机是: 当一个对象当做函数调用的时候, 如果对象定义了__invoke魔幻方法则这个函数会被调用, class Callme { publ ...

  4. php魔术方法call,PHP魔术方法__call()

    __call()方法的用法 function __call(string $function_name, array $arguments) { // 方法体 } 程序中调用未定义的方法时,__cal ...

  5. python color属性_Python中类的属性、方法及内置方法

    1.类的属性成员变量 对象的创建创建对象的过程称之为实例化,当一个对象被创建后,包含三个方面的特性对象聚丙属性和方法, 句柄用于区分不同的对象, 对象的属性和方法,与类中的成员变量和成员函数对应, o ...

  6. python中的魔法方法__new___Python魔法方法会调用new方法吗?

    Python中的sort()方法用于数组排序,本文以实例形式对此加以详细说明:一.基本形式列表有自己的sort方法,其对列表进行原址排序,既然是原址排序,那显然元组不可能拥有这种方法,因为元组是不可修 ...

  7. 对称、群论与魔术(九)——魔术《五边形的奇迹》

    早点关注我,精彩不错过! 在前面的两篇文章中,我们隆重介绍了利用对称的合理操作,进而通信后构造巧合的预言效果的第一个经典作品<tic tac toe>,相关内容请戳: 对称.群论与魔术(八 ...

  8. 约瑟夫问题与魔术(九)——魔术《五重巧合之皇家同花顺》

    本文是<约瑟夫问题与魔术>系列作品的第九篇,之前的作品回顾请戳: 约瑟夫问题与魔术(八)--魔术<四重巧合之金刚> 约瑟夫问题与魔术(七)--魔术<The Austral ...

  9. 约瑟夫问题与魔术(十)——魔术《完全控制》

    转眼写到了<约瑟夫问题与魔术>系列的第十篇,也是本系列的收官之作了,前面文章回顾请戳: 约瑟夫问题与魔术(九)--魔术<五重巧合之皇家同花顺> 约瑟夫问题与魔术(八)--魔术& ...

最新文章

  1. 推荐 33 个 IDEA 最牛配置,写代码太爽了!
  2. php53 的mcrypt模块 , 需要用源代码进行安装
  3. 主c++ 辅lua luabind protobuf
  4. 2016计算机有哪些专业知识点,2016计算机专业知识:精选知识点练习(99)
  5. 8.2.1.10 Nested-Loop Join Algorithms 嵌套循环 关联算法:
  6. Fitness - 05.23
  7. 进程和线程的联系和区别
  8. 文后参考文献著录规则 GB/T 7714-2005
  9. 认识电路板上的电子元件
  10. mdf导入虚拟主机mysql_MYSQL导入mdf文件
  11. 移植NES模拟器到STM32G431 详细移植教程 CubeMX HAL库
  12. wincc c 语言改颜色,wincc常用c脚本小草设置
  13. 网易云音乐api歌单数据获取
  14. 关于jQuery UI 使用心得及技巧
  15. 中国.net域名网站的“前世今生”,那些年的光辉
  16. Comet OJ - 2019国庆欢乐赛 G-字符串(后缀数组)
  17. linux snat mac 桥,关于SNAT在bridge中不生效的问题
  18. mysql事件示例_卓象程序员:Mysql数据库事件使用与示例
  19. PaddleNLP/ examples / semantic_indexing
  20. SWIFT,国际清算与数字人民币

热门文章

  1. 心理学学习(二)心理学与人生:利手
  2. 社区资讯 | Apache Flink 中文社区网站 Ververica 正式发布
  3. 【PostgreSQL】WITH RECURSIVE递归查询语句
  4. php sha512解密,PHP加密函数 sha256 sha512 sha256_file() sha512_file()
  5. 微信闪退Bug<图片>
  6. 此密钥盘信息在服务器上不存在,云服务器密钥使用
  7. linux文件命令介绍,linux文件搜索及其它基础命令介绍(3)
  8. dna序列分类数学建模matlab,数学建模常用的分析法及其MATLAB实现
  9. ArcGIS教程:了解水系
  10. 【二维数组与矩阵乘法】