1.__construct,__destruct
__constuct构建对象的时被调用;
__destruct明确销毁对象或脚本结束时被调用;
2.__get,__set
__set当给不可访问或不存在属性赋值时被调用
__get读取不可访问或不存在属性时被调用
3.__isset,__unset
__isset对不可访问或不存在的属性调用isset()或empty()时被调用
__unset对不可访问或不存在的属性进行unset时被调用
4.__call,__callStatic
__call调用不可访问或不存在的方法时被调用
__callStatic调用不可访问或不存在的静态方法时被调用
5.__sleep,__wakeup
__sleep当使用serialize时被调用,当你不需要保存大对象的所有数据时很有用
__wakeup当使用unserialize时被调用,可用于做些对象的初始化操作
6.__clone
进行对象clone时被调用,用来调整对象的克隆行为
7.__toString
当一个类被转换成字符串时被调用
8.__invoke
当以函数方式调用对象时被调用
9.__set_state
当调用var_export()导出类时,此静态方法被调用。用__set_state的返回值做为var_export的返回值。
10.__debuginfo
当调用var_dump()打印对象时被调用(当你不想打印所有属性)适用于PHP5.6版本

11.__autoload()
 尝试加载未定义的类,加载未定义的类时被调用

<?php
class Magic
{
public $var = 'test'; //构造函数,在创建对象的时候调用
public function __construct()
{
echo '__construct called'.PHP_EOL;
} //某个对象的引用都被删除、对象被销毁、调用exit()后、脚本关闭时被调用
public function __destruct()
{
echo '__destruct called'.PHP_EOL;
} //当给不可访问或不存在属性赋值时被调用
public function __set($name, $value)
{
echo $name.'-'.$value;
echo '__set called'.PHP_EOL;
} //读取不可访问或不存在属性时被调用
public function __get($name)
{
echo $name;
echo '__get called'.PHP_EOL;
} //调用不可访问或不存在的方法时被调用
public function __call($name, $arguments)
{
echo $name . '-' . implode(',', $arguments);
echo '__call called'.PHP_EOL;
} //调用不可访问或不存在的静态方法时被调用
public static function __callStatic($name, $arguments)
{
echo $name . '-' . implode(',', $arguments);
echo '__callStatic called'.PHP_EOL;
} //对不可访问或不存在的属性调用isset()或empty()时被调用
public function __isset($name)
{
echo $name;
echo '__isset called'.PHP_EOL;
return true;
} //对不可访问或不存在的属性进行unset时被调用
public function __unset($name)
{
echo $name;
echo '__unset called'.PHP_EOL;
} //serialize时被调用,当你不需要保存大对象的所有数据时很有用
public function __sleep()
{
echo '__sleep called'.PHP_EOL;
return array('var1111111111');
} //unserialize时被调用,可用于做些对象的初始化操作
public function __wakeup()
{
echo '__wakeup called'.PHP_EOL;
$this->var = 'test after wakeup';
} //当一个类被转换成字符串时被调用
public function __toString()
{
return '__toString called'.PHP_EOL;
} //进行对象clone时被调用,用来调整对象的克隆行为
public function __clone()
{
echo '__clone called'.PHP_EOL;
} //当以函数方式调用对象时被调用
public function __invoke()
{
echo '__invoke called'.PHP_EOL;
} //当调用var_export()导出类时,此静态方法被调用。用__set_state的返回值做为var_export的返回值。
public static function __set_state($arr)
{
return '__set_state called'.PHP_EOL;
} //当调用var_dump()打印对象时被调用(当你不想打印所有属性)适用于PHP5.6版本
public function __debuginfo($arr)
{
echo '__debuginfo called'.PHP_EOL;
return array(
'var' => 'test fro __debuginfo'
);
}
} $m = new Magic(); //__construct()被调用
$m->not_exist_property = test; //__set()被调用
echo $m->not_exist_property;//__get()被调用
$m->abc(1,2,3); //__call()被调用
echo isset($m->not_exist_property); //__isset()被调用,返回bool值
unset($m->not_exist_property); //__unset()被调用
echo $tmp = serialize($m); //__sleep()被调用
unserialize($tmp); //__wakeup()被调用
$m1 = clone $m; //__clone()被调用,对象默认是引用传递,使用clone关键词则可实现对象复制
$m(); //__invoke()
eval( '$m2 = ' . var_export ( $m , true ) . ';' );var_dump($m2);
var_dump($m);
//最后__destruct()被调用

PHP之十六个魔术方法的更多相关文章

  1. PHP十六个魔术方法

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

  2. PHP之十六个魔术方法详细介绍

    PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods),这些方法在PHP中充当了举足轻重的作用.这里进行详细介绍,感兴趣的小伙伴们可以参考一下. PHP中把以两个下划线__开头 ...

  3. PHP之十六个魔术方法详解

    https://segmentfault.com/a/1190000007250604#articleHeader14

  4. PHP:__get()、__set()、__isset()、__unset()、__call()、__callStatic()六个魔术方法

    哎呀呀,今天小仓鼠学到了魔术方法,简称魔法,哈哈哈哈,神经病啊~ 平时在面试的时候,也会遇到问魔术方法有哪些的问题哦!今天我们来了解一下下~ 1.__get() 形式: __get($objName) ...

  5. 章节十六、3-TestNG方法和类注解

    一.Test Suite(测试套件) 我们通常认为一个testcase就是一个测试方法,但是会有很多的testcase,所以我们不可能把所有的testcase放到同一个测试类中,假如需要测试的页面有1 ...

  6. Python之路(第四十六篇)多种方法实现python线程池(threadpool模块\multiprocessing.dummy模块\concurrent.futures模块)

    一.线程池 很久(python2.6)之前python没有官方的线程池模块,只有第三方的threadpool模块, 之后再python2.6加入了multiprocessing.dummy 作为可以使 ...

  7. 网站开发进阶(三十六)String.getBytes()方法中的中文编码问题

    String.getBytes()方法中的中文编码问题 String的getBytes()方法是得到一个系统默认的编码格式的字节数组. getBytes("utf-8")得到一个U ...

  8. Python笔记(二十六)_魔法方法_属性的魔法方法

    属性的魔法方法 __getattribute__(self,name):当该类的属性被访问时,自动触发,是最先被触发的属性方法 __setattr__(self,name,value):当一个属性被设 ...

  9. PHP魔术方法大全

    十六个魔术方法详解如下 说明:PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods),这些方法在PHP中充当了举足轻重的作用. 魔术方法包括: __construct(),类的 ...

随机推荐

  1. UE4 编译笔记

    UE4 的功能被分成了很多的模块,在API文档里每个类都有 Module 这个属性(值为模块名)每个模块使用其他模块要在Build.cs里导入,像vs里的引入库.在构建时 PublicDependen ...

  2. Windows jdk安装以及版本切换

    Windows jdk版本切换 一.安装 1.下载 官网: Java SE Development Kit 8 Downloads Java SE 7 Archive Downloads 1.7之前的 ...

  3. 多项式乘法(FFT)学习笔记

    ------------------------------------------本文只探讨多项式乘法(FFT)在信息学中的应用如有错误或不明欢迎指出或提问,在此不胜感激 多项式 1.系数表示法  ...

  4. #6284. 数列分块入门 8(区间询问等于一个数 cc 的元素,并将这个区间的所有元素改为 c)

    题目链接:https://loj.ac/problem/6284 题目大意:中文题目 具体思路:还是和sqrt那个题的思路相同的,标记每一块的值是不是相同的,注意lazy下标的下放. AC代码: #i ...

  5. java实现在线浏览PDF文档功能

    实现在线浏览pdf文档功能(本代码适用于项目服务中固定的并且少量的pdf浏览,比如注册时的注册条款在线浏览等): //设置响应内容类型为PDF类型 response.setContentType(&q ...

  6. 使用Swagger自动生成API文档

    ⒈添加pom依赖 <!-- Swagger核心包,用于扫描程序生成文档数据 --> <dependency> <groupId>io.springfox</g ...

  7. 百度echarts样式开发

    Echarts如何进行实例化 var a1 = null; a1= echarts.init(document.getElementById('a1')); a1.setOption({ color: ...

  8. Pytorch之验证码识别

    本文主要实现了两个工作:1.验证码生成   2.Pytorch识别验证码 一. 验证码生成 方法1. 利用PIL库的ImageDraw实现绘图,此法参考博客实现: #!/usr/bin/env pyt ...

  9. LwIP Application Developers Manual7---lwIP with or without an operating system

    1.前言 最近有一些讨论关于lwIP如何在单机的环境(比如,没有一个多线程的操作系统)使用. 本文的目的就是描述lwIP如何在无多线程操作系统或有多线程操作系统环境中运行 2.lwIP单线程内核 2. ...

  10. Zynq-Linux移植学习笔记之27UIO机制响应外部中断实现【转】

    转自:https://blog.csdn.net/zhaoxinfan/article/details/80285150 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog ...