001 PHP把所有以__(两个下划线)开头的类方法当成魔术方法,并且这些魔术方法的参数都不能通过引用传递。php的魔术方法有:
002  __construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state() 和 __clone()等。
003  下面简单说一下对应的功能:
004  Class MyClass {
005  __construct($var1,$var2) {
006  //构造器
007  }
008  __destruct() {
009  //析构方法
010  }
011  __clone() {
012  //克隆方法 $obj2 = clone $obj1; 时执行
013  
014 对象的复制
015  
016 class a{ 
017     public $s ''
018
019 $a_1 new a(); 
020 $a_1->s = 'a1'
021 $a_2 = clone $a_1
022 $a_2->s = 'a2'
023 echo $a_1->s; //'a1' 
024 echo $a_2->s; //'a2' 
025  
026 浅度复制
027  
028 class a{
029   public $s '';
030  }
031  class b{
032   public $a = null;
033   public $str = null;
034  }
035  
036 $str '123';
037  $b_1 new b();
038  $b_1->a = new a();
039  $b_1->str = & $str;
040  
041 $b_1->a->s = 'b1';
042  $b_2 = clone $b_1;
043  $b_2->a->s = 'aaaaa';
044  $b_2->str = 'nihao';
045  echo $b_1->a->s;
046  echo "\n";
047  echo $b_1->str;
048  echo "\n";
049  echo $b_2->a->s;
050  echo "\n";
051  echo $b_2->str;
052  
053   
054  
055 深度复制
056  
057 class a{
058   public $s '';
059  }
060  class b{
061   public $a = null;
062   public $str = null;
063   public function __clone(){
064    $b $this->str;
065    $this->str = & $b;
066    $this->a = clone($this->a);
067   }
068  }
069  
070 $str '123';
071  $b_1 new b();
072  $b_1->a = new a();
073  $b_1->str = & $str;
074  
075 $b_1->a->s = 'b1';
076  $b_2 = clone $b_1;
077  $b_2->a->s = 'aaaaa';
078  $b_2->str = 'nihao';
079  echo $b_1->a->s;
080  echo "\n";
081  echo $b_1->str;
082  echo "\n";
083  echo $b_2->a->s;
084  echo "\n";
085  echo $b_2->str;
086  
087  
088  }
089  __call($fun,$args) {
090  //魔术调用 方法名和参数
091  
092     if(method_exists($this$fun.count($args))){
093  
094        return call_user_func_array(array(&$this,$fun.count($args)),$args);
095  
096       }else{
097  
098        throw new Exception('调用了未知的方法:'.__METHOD__);
099  
100       }
101  }
102  __callStatic($fun,$args) {
103  //魔术调用 静态方法名和参数
104  //可见性未设置为public或未声明为static的时候会产生一个警告 。
105  //本特性只在PHP 5.3.0 及以上版本有效。
106     与__call区别:修饰stati
107  }
108  __invoke($args) {
109  //把类作为函数使用 参数
110  //当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用
111  //本特性只在PHP 5.3.0 及以上版本有效。<span>   
112  
113 class Callme {        
114     public function __invoke($phone_num) {            
115     echo "Hello: $num";         }    
116 }     
117 $call new Callme();    
118 $call(13810688888); // "Hello: 13810688888 
119 }
120  __toSring() {
121  //对象输出 $echo $obj = new Class(); 时输出 </span> }
122  
123  __set($var,$value) {
124  //设置对象属性 $obj->var = value 赋值
125  //在给未定义的变量赋值时,__set() 会被调用。
126  }
127  __get($var) {
128  //读取对象属性 $obj->var 获取
129  //读取未定义的变量的值时,__get() 会被调用。
130  }
131  __isset($var) {
132  //判断对象内部属性是否存在 isset($obj->var )。
133  //当对未定义的变量调用isset() 或 empty()时,__isset() 会被调用。
134  //自PHP 5.1.0起有效
135  }
136  __unset($var) {
137  //释放内部对象属性 unset($obj->var)。
138  //当对未定义的变量调用unset()时,__unset() 会被调用。
139  //自PHP 5.1.0起有效
140  }
141  
142 __set_state(array $args) {
143  //当调用var_export()时,这个静态 方法会被调用。
144  //本方法的唯一参数是一个数组,其中包含按array(‘property’ => value, …)格式排列的类属性。
145  //自PHP 5.1.0起有效
146  }
147  __sleep() {
148  //序列化前奏方法 return array($var1,$var2);
149  }
150  __wakeup() {
151  //反序列化前奏方法 $this->var = ‘other_value’
152  }
153  }
154  
155 补充:一个类外面使用的自动加载方法:
156  
157 __autoload($classname) {
158  require(PATH.$classname.’_class.php’);
159  }

php类的魔术方法也就是带下划线的类方法介绍及应用的更多相关文章

  1. Python 类的魔术方法

    Python中类的魔术方法 在Python中以两个下划线开头的方法,__init__.__str__.__doc__.__new__等,被称为"魔术方法"(Magic method ...

  2. day19-Python运维开发基础(类的魔术方法)

    1. __new__魔术方法 # ### __new__ 魔术方法 ''' 触发时机:实例化类生成对象的时候触发(触发时机在__init__之前) 功能:控制对象的创建过程 参数:至少一个cls接受当 ...

  3. 关于python中带下划线的变量和函数 的意义

    总结: 变量: 1.  前带_的变量:  标明是一个私有变量, 只用于标明, 外部类还是可以访问到这个变量 2.  前带两个_ ,后带两个_ 的变量:  标明是内置变量, 3.  大写加下划线的变量: ...

  4. [转]关于python中带下划线的变量和函数的意义

    Python 的代码风格由 PEP 8 描述.这个文档描述了 Python 编程风格的方方面面.在遵守这个文档的条件下,不同程序员编写的 Python 代码可以保持最大程度的相似风格.这样就易于阅读, ...

  5. TabTopUnderLineLayout【自定义顶部选项卡(带下划线)】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 自定义顶部选项卡布局LinearLayout类,实现带下划线样式的效果. 备注:如果配合Fragment的话,MainActivit ...

  6. TabTopAutoLayout【自定义顶部选项卡区域(带下划线)(动态选项卡数据且可滑动)】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 自定义顶部选项卡布局LinearLayout类,实现带下划线且可滑动效果.[实际情况中建议使用RecyclerView] 备注:如果 ...

  7. FragmentTabHostUnderLineDemo【FragmentTabHost带下划线】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 使用FragmentTabHost实现顶部选项卡(带下划线效果)展现. 效果图 代码分析 1.该Demo中采用的是FragmentT ...

  8. 【转】关于python中带下划线的变量和函数 的意义

    http://www.blogjava.net/lincode/archive/2011/02/02/343859.html 总结: 变量: 1.  前带_的变量:  标明是一个私有变量, 只用于标明 ...

  9. Python里的单下划线,双下划线,以及前后都带下划线的意义

    Python里的单下划线,双下划线,以及前后都带下划线的意义: 单下划线如:_name 意思是:不能通过from modules import * 导入,如需导入需要:from modules imp ...

随机推荐

  1. 【转载】Win7下如何使用GCC编译器

    转自:http://jingyan.baidu.com/article/c275f6bacc0126e33c756771.html 双击GCC安装包,mingw-get-setup.exe,点击Ins ...

  2. 题解 P5594 【【XR-4】模拟赛】

    P5594 [[XR-4]模拟赛] 洛谷10月月赛 II & X Round 4 Div.2前两道签到题还是很简单的,基本上是半小时内一遍过两题 看看题解,这题STL做法有用set输出size ...

  3. layui-table 样式

    <!DOCTYPE html> <html> <head> <style> #lay-table { background-color: #fff; c ...

  4. 1 dev repo organize

    码云  注册 组织  创建 仓库  创建 Git版本管理工具 download from https://www.git-scm.com/download/ 克隆/下载 git clone https ...

  5. Mac配置内网穿透

    闲语: Java开发过程中,往往会对接第三方,而在对接过程中,双方间使用的最多的"通讯"方式就是异步通知.可是异步通知过程中,只能通知到外网地址,可是在调试过程我们都是在本地进行- ...

  6. SniperOJ-as fast as you can-Writeup

    SniperOJ-as fast as you can-Writeup 题目描述: 打开所给的题目地址 很容易可以看出这是一个简单的爬虫问题,爬去网页的信息并post,但在界面及网页源码中均没发现有价 ...

  7. 1010 Radix (25分)

    改了一天也没明白,第7个数据是怎么卡的 #include <bits/stdc++.h> using namespace std; const int maxn=1005; typedef ...

  8. 安装和配置Windows系统虚拟机

    1.打开虚拟机软件,点击新建虚拟机. 2.选择典型配置,点击下一步. 3.点击安装程序光盘映像文件,选择对应的映像文件,然后点击下一步.选择对应的密钥和版本,设置密码等. 4.创建虚拟机名字和存储位置 ...

  9. php 发送手机验证码

    嗯哼,做为一个好的程序猿,一定要给顾客爸爸剁手的时候,充分的告诉他,你剁完手了,所以不只有邮件通知还要有手机短信的通知,今天就来写一下php发送验证码 1.首先我就写了几个个方法,因为配置在后台,直接 ...

  10. 外置ADC

    美信关于如何简化微控制器与温度传感器的接口设计?: 一般外置ADC与单片机UC之间通过SPI或SMBUS接口通信 当IO口比较紧张时可以选择脉冲或频率方波正比与测量值输出的外置ADC,此时也可以实现光 ...