PHPer 高手之路
  • Introduction
  • First Chapter
  • 基础
    • 数据类型和常量
    • 字符串
      • 字符编码
      • 字符编码相关编程
    • 引用变量
    • 运算符与错误控制符@
    • 流程控制与条件判断
      • foreach遍历中的引用
    • 函数
    • 文件及目录处理
  • PHP 数组
    • 基础
    • PHP数组操作
    • 输入流 php://input
    • PHP数组的内部实现
    • PHP数组和数据结构
    • 示例技巧
  • PHP文件编程
    • 文件系统
    • 基础
    • 实例技巧
    • PHP中XML处理
    • PHP中JSON处理
    • PHP中CSV处理
    • 大文件上传
  • 正则表达式
    • 基础
    • 正则的引擎
    • 表达式的优化
    • PHP中正则的使用
  • PHP 编码技巧
    • PHP编码习惯
    • PHP语法糖
    • PHP代码优化
    • PHP重点新特性
    • PHP编码规范
  • PHP选项和运行原理
    • PHP SAPI
    • PHP运行模式及安装方式
    • 附录:进程和线程的Q解
    • Apache下的MPM模式
    • Apache 与 Nginx
    • PHP的运行机制及原理
    • PHP垃圾回收机制
    • PHP配置选项
  • PHP安全
    • 跨站脚本攻击(XSS )
    • 跨站请求伪造(CRSF)
  • PHP 高级特性
    • 异常处理(Exceptions)
    • 代码复用(Trait)
    • 预定义接口(Predefined Interfaces)
    • 魔术方法(Magic Methods)
    • 回调函数、匿名函数&闭包
    • 命名空间(Namespaces)
    • 自动加载(Autoload)
    • 反射(Reflection)
    • 魔术常量(Magic constants)
    • 综合实例
  • 附录:关键词
  • 附录:资料
  • 代码的版本控制
    • SVN
    • Git
      • 疑难杂症
  • Linux
    • Linux原理与基础
    • 常见命令
    • Shell 编程
    • awk 与 sed
    • 命令笔记
  • HTTP 协议
    • 请求方法与返回状态码
    • Cookie、Session 的原理
  • MySQL
    • MySQL表存储引擎
  • 标准PHP库(SPL)
    • 数据结构
      • SplPriorityQueue - 优先队列
      • SplQueue - 队列
      • SplStack - 栈的功能
    • 接口
      • Countable - count统计接口
  • 附录:ElasticSearch
  • PHP数据结构
  • 附录:Rabbitmq
  • 附录:guzzle
  • JavaScript
    • 附录:资料
  • 疑难杂症
Powered by GitBook
On this page

Was this helpful?

  1. PHP 高级特性

魔术方法(Magic Methods)

  • __construct() 构造方法,类实例化的时候执行

  • __destruct() 析构函数,某个对象所有引用都被删除或者当前对象显示销毁的时候执行

  • __call() 调用类中一个不存在的方法的时候执行

  • __callStatic() 调用不存在的静态方法时,执行

  • __get() 调用不在的数组时执行

  • __set() 设置对象中不存在的属性时执行

  • __isset() 判断一个对象属性是否存在时执行

  • __unset() 销毁一个对象属性时执行

  • __sleep() 序列化一个对象前执行

  • __wakeup() 反序列化一个对象前执行

  • __toString() 把对象当成字符串输出时执行,返回一个字符串

  • __invoke() 把对象以函数的形式调用的时候执行

  • __set_state() 5.1.0时启用,调用var_export函数前执行

  • __clone() 克隆一个的对象的时候调用

示例:

class Test {

    function __call($function_name, $args)
    {
        echo "你所调用的方法:$function_name(参数:<br />";
        var_dump($args);
        echo ")不存在!";
    }

    function __callstatic($function_name, $args)
    {
        echo "你所调用的静态方法:$function_name(参数:<br />";
        var_dump($args);
        echo ")不存在!";
    }
}

$obj = new Test();
$obj->test();
$obj::test();

示例:

注意:经过测试,两个方法不能同时存在,只能有一个被运行(php7下测试运行)

class Test {

    function __sleep()
    {
      echo '执行了serialize()函数';
    }


    function __wakeup()
    {
        echo '执行了unserialize()函数';
    }
}

$obj = new Test();
$serializeObj = serialize($obj);
$unserializeObj = unserialize($serializeObj);

示例:

class Test {

    function __invoke()
    {
        echo '把对象当成函数调用了';
    }
}

$obj = new Test();
$obj();

示例:

<?php

class Test {

    function __toString()
    {
        return '把对象当成字符串了';
    }
}

$obj = new Test();
echo $obj;

实例

class Test{
    public $a;
    static function __set_state($array) {//必须是静态方法,参数是一个数组
        echo '调用了var_export函数';
        $tmp = new Test();
        $tmp->a = 'abc';//直接赋值
        return $tmp;//必须返回一个对象,可以是其他类的对象
    }

}
$test = new Test();
eval('$b = '.var_export($test,true).';');
var_dump($b);

资料

Previous预定义接口(Predefined Interfaces)Next回调函数、匿名函数&闭包

Last updated 5 years ago

Was this helpful?

php---魔术方法(__tostring(),__set_state())
中年大叔的PHP学习之旅——魔术方法__sleep和__wakeup