php类的魔术方法也就是带下划线的类方法介绍及应用
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类的魔术方法也就是带下划线的类方法介绍及应用的更多相关文章
- Python 类的魔术方法
Python中类的魔术方法 在Python中以两个下划线开头的方法,__init__.__str__.__doc__.__new__等,被称为"魔术方法"(Magic method ...
- day19-Python运维开发基础(类的魔术方法)
1. __new__魔术方法 # ### __new__ 魔术方法 ''' 触发时机:实例化类生成对象的时候触发(触发时机在__init__之前) 功能:控制对象的创建过程 参数:至少一个cls接受当 ...
- 关于python中带下划线的变量和函数 的意义
总结: 变量: 1. 前带_的变量: 标明是一个私有变量, 只用于标明, 外部类还是可以访问到这个变量 2. 前带两个_ ,后带两个_ 的变量: 标明是内置变量, 3. 大写加下划线的变量: ...
- [转]关于python中带下划线的变量和函数的意义
Python 的代码风格由 PEP 8 描述.这个文档描述了 Python 编程风格的方方面面.在遵守这个文档的条件下,不同程序员编写的 Python 代码可以保持最大程度的相似风格.这样就易于阅读, ...
- TabTopUnderLineLayout【自定义顶部选项卡(带下划线)】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 自定义顶部选项卡布局LinearLayout类,实现带下划线样式的效果. 备注:如果配合Fragment的话,MainActivit ...
- TabTopAutoLayout【自定义顶部选项卡区域(带下划线)(动态选项卡数据且可滑动)】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 自定义顶部选项卡布局LinearLayout类,实现带下划线且可滑动效果.[实际情况中建议使用RecyclerView] 备注:如果 ...
- FragmentTabHostUnderLineDemo【FragmentTabHost带下划线】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 使用FragmentTabHost实现顶部选项卡(带下划线效果)展现. 效果图 代码分析 1.该Demo中采用的是FragmentT ...
- 【转】关于python中带下划线的变量和函数 的意义
http://www.blogjava.net/lincode/archive/2011/02/02/343859.html 总结: 变量: 1. 前带_的变量: 标明是一个私有变量, 只用于标明 ...
- Python里的单下划线,双下划线,以及前后都带下划线的意义
Python里的单下划线,双下划线,以及前后都带下划线的意义: 单下划线如:_name 意思是:不能通过from modules import * 导入,如需导入需要:from modules imp ...
随机推荐
- alibaba-java-style-guide
(一) 命名规约 1.[强制]代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束. 反例: _name / __name / $Object / name_ / name$ / O ...
- react+ant design Breadcrumb面包屑组件
import React from 'react'; import { Link }from 'react-router-dom'; import { Breadcrumb } from 'antd' ...
- 解决VS2017中出现:This function or variable may be unsafe
解决办法:项目名称-右键属性-C/C++ - 预处理器 -预处理器定义 - 右侧下拉框中选择"编辑"- 在第一个编辑框中添加_CRT_SECURE_NO_WARNINGS
- 概率dp light 1321
题意:给定一张无向图,每条边都有一个通过的概率 ,如果无法通过,那么就要回到起点重新出发从起点到终点的时间固定为K,如果成功到达,又需要额外花费K的时间,问走S次的最小期望时间 思路:这道题分为两部分 ...
- Abaqus 载荷分类(部分)
目录 1. 集中载荷 1.1 集中载荷施加方法 1.2 定义集中跟随力 1.3 指定文件定义集中节点力 2. 分布载荷 2.1 分布载荷分类 3. 热载荷 3.1 模拟热辐射 3.2 直接定义热流量 ...
- [lua]紫猫lua教程-命令宝典-L1-01-01. Lua环境与IDE
网上大把的lua教程 不过紫猫老师的教程向来都是讲的非常仔细 所以最近天气已经36+了 魔兽世界还需要冲飞行声望 懒得写单子根本没有单子,正好认认真真的看下紫猫老师的lua教程 紫猫老师的lua教 ...
- SpringMVC--提交表单
今天使用AbstractCommandController做一个提交表单的样例 (1)首先,建立一个User.java package com.zk.domain; import java.util. ...
- Python 特殊列表操作记录
1.列表中的NaN数据处理 由于在Excel中筛选数据时,会出现NaN这种数据,所以需要将其删除掉,处理函数如下: 由于NaN数据类型与其他数据类型不一样,所以需要需要根据类型将其去除掉. 2列表关于 ...
- MySQL 学习(二)总体框架 & redo-log 和 bin-log 的介绍
文章部分总结来自课程,非原创 MySQL 组织架构 下面这张图就可以解释关于 MySQL 底层的组织架构了. 上面的图可以直观地展示两个重要的东西 : 一条 SQL 的执行流程 MyS ...
- 转载:AAC文件解析及解码
转自:http://blog.csdn.net/wlsfling/article/details/5876016 http://www.cnblogs.com/gaozehua/archive/201 ...