1 <?php
  2     #自动加载方法,当new一个class时,若class未被引入,则会自动调用__autoload()方法
  3     function __autoload($className) {
  4         include $className . ".php";
  5     }
  6
  7     class Son {
  8         private $name;
  9
 10         public function __construct($name) {
 11             $this->name = $name;
 12         }
 13
 14         #echo输出类时,自动调用此方法
 15         public function __toString() {
 16             return $this->name;
 17         }
 18     }
 19
 20     class Man {
 21         private $name;
 22         private $age;
 23         private $son;
 24
 25         public function __construct($name, $age, Son $son) {
 26             $this->name = $name;
 27             $this->age = $age;
 28             $this->son = $son;
 29         }
 30
 31         #析构方法,当脚本结束或调用unset()时执行此方法
 32         public function __destruct() {
 33             echo "Destruct: I'm {$this->name}, I was killed at " . date("Y-m-d H:i:s") . "<br>";
 34         }
 35
 36         public function __toString() {
 37             return "toString: I'm {$this->name}, and {$this->age} years old, my son is {$this->son}.<br>";
 38         }
 39
 40         #当调用一个不存在的function时,自动调用此方法
 41         public function __call($funcName, $args) {
 42             echo "Call: You call func \"{$funcName}\" with args \"" . serialize($args) . "\" ? It's not existed.<br>";
 43         }
 44
 45         #当调用一个不存在的static function时,自动调用此方法
 46         public static function __callStatic($funcName, $args) {
 47             echo "callStatic: You call static func \"{$funcName}\" with args \"" . serialize($args) . "\" ? It's not existed.<br>";
 48         }
 49
 50         #当调用get而$varName不存在时,自动调用此方法
 51         public function __get($varName) {
 52             return "Get: You call the variable \"{$varName}\" ? It's not existed.<br>";
 53         }
 54
 55         #当调用set而$varName不存在时,自动调用此方法
 56         public function __set($varName, $val) {
 57             echo "Set: You want to assign value \"{$val}\" to variable \"{$varName}\" ? It's not existd.<br>";
 58         }
 59
 60         #当调用isset而$varName不存在时,自动调用此方法
 61         public function __isset($varName) {
 62             echo "Isset: Tell you, the variable \"{$varName}\" is not existed.<br>";
 63         }
 64
 65         #当调用unset而$varName不存在时,自动调用此方法
 66         public function __unset($varName) {
 67             echo "Unset: Tell you, the variable \"{$varName}\" has never been existed.<br>";
 68         }
 69
 70         #调用serialize()前,会先执行此方法,serialize()只序列化__sleep()方法返回的成员变量
 71         public function __sleep() {
 72             return array("name");
 73         }
 74
 75         #调用unserialize()前,会先执行此方法
 76         public function __wakeup() {
 77             $this->age = "21";
 78         }
 79
 80         #当将class当做function调用时,会执行此方法
 81         public function __invoke($var) {
 82             echo "You want to invoke class \"" . __CLASS__ . "\" as a func with args \"{$var}\"? No! That's wrong!<br>";
 83         }
 84
 85         #调用clone时,会执行此方法
 86         public function __clone() {
 87             $this->son = clone $this->son;    #此处进行深复制,强制将对象型成员变量复制一份新拷贝,否则只是复制对象引用
 88         }
 89     }
 90
 91     $man = new Man("Jack", 18, new Son("Dick"));
 92     $man->smoke("Camle cigarette");    #测试__call()
 93     Man::drink(array("juice", "water"));    #测试__callStatic()
 94     echo $man->wife;    #测试__get()
 95     $man->wife = "Rose";    #测试__set()
 96     isset($man->daughter);    #测试__isset()
 97     unset($man->daughter);    #测试__unset()
 98     echo serialize($man) . "<br>";    #测试__sleep()
 99     echo unserialize(serialize($man));    #测试__wakeup()
100     $man("kiss");    #测试__invoke()
101     $manNew = clone $man;    #测试__clone()
102     echo $manNew;
103     $woman = new Woman();    #测试__autoload()
104 ?>

页面输出

Call: You call func "smoke" with args "a:1:{i:0;s:15:"Camle cigarette";}" ? It's not existed.
callStatic: You call static func "drink" with args "a:1:{i:0;a:2:{i:0;s:5:"juice";i:1;s:5:"water";}}" ? It's not existed.
Get: You call the variable "wife" ? It's not existed.
Set: You want to assign value "Rose" to variable "wife" ? It's not existd.
Isset: Tell you, the variable "daughter" is not existed.
Unset: Tell you, the variable "daughter" has never been existed.
O:3:"Man":1:{s:9:"Manname";s:4:"Jack";}
toString: I'm Jack, and 21 years old, my son is .
Destruct: I'm Jack, I was killed at 2012-08-11 20:00:34
You want to invoke class "Man" as a func with args "kiss"? No! That's wrong!
Destruct: I'm Jack, I was killed at 2012-08-11 20:00:34

PHP各种魔术方法测试相关推荐

  1. php超全局变量,魔术常量,魔术方法

    整理了下关于php的基础知识,参考了些资料,如下: 超全局变量 超全局变量 - 超全局变量是在全部作用域中始终可用的内置变量: $GLOBALS $GLOBALS - 引用全局作用域中可用的全部变量 ...

  2. pyhton中的魔术方法

    魔术方法 ***** 特殊属性 属性 说明 __name__ 类.函数.方法等的名字 __module__ 类定义所在的模块名 __class__ 对象或类所属的类 __bases__ 类的基类的元组 ...

  3. PHP5中的魔术方法

    一. __construct(),类的构造函数 php中构造方法是对象创建完成后第一个被对象自动调用的方法.在每个类中都有一个构造方法,如果没有显示地声明它,那么类中都会默认存在一个没有参数且内容为空 ...

  4. php中魔术方法的应用

    魔术方法是以两个下划线 '__' 开头,具有特殊作用的一些方法,可以看做 PHP 的 "语法糖". 语法糖:指那些没有个计算机语言添加新功能,而只是对人类来说更 "甜蜜& ...

  5. mysql 魔术设置_PHP之十六个魔术方法详细介绍

    PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods),这些方法在PHP中充当了举足轻重的作用. 魔术方法包括: __construct(),类的构造函数 __destruct ...

  6. PHP面向对象常见的关键字和魔术方法

    在PHP5的面向对象程序设计中提供了一些常见的关键字,用来修饰类.成员属性或成员方法,使他们具有特定的功能,例如final.static.const等关键字.还有一些比较实用的魔术方法,用来提高类或对 ...

  7. python魔术方法由谁定义_Python的魔术方法

    魔术方法就是在定义的类中定义一些"不一般"的方法,使类的使用更方便.完善.健壮,是python特有的方法,一般都是前后包含两个下划线__的方法称为魔术方法,例如__new__. 基 ...

  8. PHP十六个魔术方法

    PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods),这些方法在PHP中充当了举足轻重的作用. 魔术方法包括: __construct(),类的构造函数 __destruct ...

  9. python中的魔术方法

    魔术方法 魔术方法就是一个类/对象中的方法,和普通方法唯一的不同时,普通方法需要调用!而魔术方法是在特定时刻自动触发. 1.__init__ 初始化魔术方法 触发时机:初始化对象时触发(不是实例化触发 ...

最新文章

  1. 渗透测试与自动化安全测试工具比较
  2. Javascript_初学第1天
  3. base64的c语言实现方法
  4. 在Html中使用Requirejs进行模块化开发
  5. 转工厂方法模式-想吃什么汉堡自己要
  6. jQuery筛选器常用总结
  7. Oracle优化检查表
  8. html5 对比 HTML4 新增,HTML5对比HTML4的主要改变和改进总结
  9. 小白python语言基础
  10. 矩阵键盘消抖 c语言,按键消抖,矩阵键盘原理和矩阵键盘的仿真模型
  11. 嵌入式开发的基础知识大揭秘
  12. JDBC操作MYSQL数据库
  13. 电脑linux 开启热点hostapt,Ubuntu16.04开启热点
  14. sin1用计算机怎么算,sin1等于多少?
  15. perl q qq qr qw qx 区别与使用方法
  16. 如何在三个月内获得三年的工作经验(转载)
  17. 解决FIFO读写位宽不等的问题
  18. 有时候缘分来了,挡也挡不住,我们终究能等到对的那个人。
  19. 硬盘修复真经 误区、缺陷、参数与低格
  20. Java中存取Rtf文件

热门文章

  1. 千万级的mysql数据库与sql优化方法
  2. Thirft框架介绍
  3. postman断言之常用函数
  4. 74 计算机图形学开源处理库
  5. angularJS 修改操作select回显选中的数据
  6. 微信WebView关闭后本地cookie无法清除问题
  7. Angular2.0 基础: User Input
  8. 需要按次序点击链接的网页特效
  9. [转]要有梦----送给自己,希望自己能尽快走出当前的痛苦期
  10. 现在已经到了考虑云计算的时候