基于PHP5魔术常量与魔术方法的详解


Posted in PHP onJune 13, 2013

魔术常量:
1。__LINE__
返回文件中的当前行号。
2。__FILE__

返回文件的完整路径和文件名。如果用在包含文件中,则返回包含文件名。自PHP4.0.2 起,__FILE__总是包含一个绝对路径,而在此之前的版本有时会包含一个相对路径。
3。__FUNCTION__

返回函数名称(PHP4.3.0 新加)。自PHP5 起本常量返回该函数被定义时的名字(区分大小写)。在PHP4 中该值总是小写字母的。
4。__CLASS__

返回类的名称(PHP4.3.0 新加)。自PHP5 起本常量返回该类被定义时的名字(区分大小写)。在PHP4 中该值总是小写字母的。
5。__METHOD__

返回类的方法名(PHP5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。
魔术函数:
1。__construct()

构造函数: 实例化对象时被调用,

当__construct和以类名为函数名的构造函数同时存在时,__construct将被调用,另一个不被调用。
4。__get()

读取一个对象的属性时,若属性存在,则直接返回属性值;若不存在,则会调用__get函数。
5。__set()

设置一个对象的属性时,

若属性存在,则直接赋值;

若不存在,则会调用__set函数。
6。__toString()

打印一个对象的时被调用。如echo$obj;或print$obj;
7。__clone()

克隆对象时被调用。如:$t=newTest();$t1=clone $t;
8。__sleep()

serialize之前被调用。若对象比较大,想删减一点东东再序列化,可考虑一下此函数。
9。__wakeup()

unserialize时被调用,做些对象的初始化工作。
10。__isset()

检测一个对象的属性是否存在时被调用。如:isset($c->name)。
11。__unset()

unset一个对象的属性时被调用。如:unset($c->name)。
12。__set_state()

调用var_export时,被调用。用__set_state的返回值做为var_export的返回值。
13。__autoload()

实例化一个对象时,如果对应的类不存在,则该方法被调用。

初识魔术方法
Php5.0发布以来为我们提供了很多面向对象的特性,尤其是为我们提供了好多易用的魔术方法,这些魔术方法可以让我们简化我们的编码,更好的设计我们的系统。今天我们就来认识下php5.0给我们提供的魔术方法。
PHP| 魔术方法|__toString(),__clone(),__call(),__autoload() 详解
__toString()
如果我有一个类:
classPerson
{
private $name = “”;
private $age = 0;
function__construct($name = “”, $age = “”)
{
$this->name =$name;
$this->age = $age;
}
functionsay()
{
echo“name:”.$this->name.”<br/>”.”age:”.$this->age.”<br/>”;  
}
}
现在我去实例化这个类,然后去打印这个实例:
$p1= new person(“liuzy”,20);
echo $p1;  //直接打印会出错
显然这样直接打印对象是会出现错误的,因为对象是引用句柄,不能直接打印。这时,我们可以用到__toString()方法。我们在Person类里加一个__toString()方法:
function__toString()
{
return “I am  Person,my name is“.$this->name.”<br/>”;
}
然后再刷新页面,发现什么了?
现在我们明白,__toString()是在直接打印对象时执行的方法,我们可以用该方法打印类的一些相关信息。注意:是两个下划线,方法必须有返回值。
__clone()
我们知道对象是可以直接赋值的,比如
$p2= $p1;   //这里是一个对象有两个引用
那么我执行:
$p1->say();
$p2->say();
是都可以执行的,而且效果一样。

我们还有一种方法:
$p3= clone $p1;    //注意clone是克隆关键字,这里与上面的不同是$p3是一个新的对象。
同时我们在类里加入一个方法:
function__clone()
{
$this->name = “我是副本”; //注意:这里的$this是克隆产生的对象本身,不是当前类
}
然后我们执行:
$p3->say();
打印出:
name:我是副本
age:20
到这里我们明白,__clone()方法是在克隆对象的时候执行的方法,它的作用是对新克隆出来的副本进行属性初始化等操作。
__call()
这个方法的主要功能是:在该类的实例调用一个不存在的方法时,执行该__call()方法。注意需要提前在类里声明:
function__call($fname,$argus)
{
echo “你调用的方法:”.$fname.”不存在<br/>”;
echo“参数是”.print_r($argus);
}
__autoload()
我们在平时调用一个类的时候,必须要先将该类所在的文件引入(include“xxx.php”),如果我们在一个页里调用的类很多,那么我们不得不使用许多的include“xxx.php”。显然这样很麻烦。
__autoload()方法可以帮我们解决这个问题。

比如我们将上面的那个Person类所在的文件定义为Person_class.php ,
再新建一个php文件 test.php,编辑内容:
function __autoload($calssName)
{
include $className.”_class.php”; //看到这也许你就明白了吧?哈哈
}
$p= new Person(“mifan”, 22);
$p->say();
这样执行该test.php页面就不会出现错误了。
__autoload()方法是在生命不存在的类时调用的方法,它有一个string类型的参数是声明该不存在类的类名。
当然,类文件的命名也是很有讲究的。最好是和类有关系,比如Person_class.php

PHP 相关文章推荐
PHP最常用的ini函数分析 针对PHP.ini配置文件
Apr 22 PHP
PHP is_dir() 判断给定文件名是否是一个目录
May 10 PHP
分享一个PHP数据流应用的简单例子
Jun 01 PHP
ThinkPHP模板循环输出Volist标签用法实例详解
Mar 23 PHP
PHP二进制与字符串之间的相互转换教程
Oct 14 PHP
PHP模拟http请求的方法详解
Nov 09 PHP
php中请求url的五种方法总结
Jul 13 PHP
php基于自定义函数记录log日志方法
Jul 21 PHP
thinkphp 抓取网站的内容并且保存到本地的实例详解
Aug 25 PHP
快速解决PHP调用Word组件DCOM权限的问题
Dec 27 PHP
PHP通过文件路径获取文件名的实例代码
Oct 14 PHP
PHP中通过getopt解析GNU C风格命令行选项
Nov 18 PHP
基于PHPExcel的常用方法总结
Jun 13 #PHP
深入PHP FTP类的详解
Jun 13 #PHP
PHP代码审核的详细介绍
Jun 13 #PHP
PHP设计模式之调解者模式的深入解析
Jun 13 #PHP
PHP设计模式之迭代器模式的深入解析
Jun 13 #PHP
PHP设计模式之解释器模式的深入解析
Jun 13 #PHP
PHP设计模式之代理模式的深入解析
Jun 13 #PHP
You might like
PHP新手上路(八)
2006/10/09 PHP
常用的php ADODB使用方法集锦
2008/03/25 PHP
php数组函数序列之array_combine() - 数组合并函数使用说明
2011/10/29 PHP
thinkPHP实现瀑布流的方法
2014/11/29 PHP
Laravel使用swoole实现websocket主动消息推送的方法介绍
2019/10/20 PHP
jquery实现实时改变网页字体大小、字体背景色和颜色的方法
2015/08/05 Javascript
Jquery日历插件制作简单日历
2015/10/28 Javascript
JS在一定时间内跳转页面及各种刷新页面的实现方法
2016/05/26 Javascript
判断js的Array和Object的实现方法
2016/08/29 Javascript
js实现移动端导航点击自动滑动效果
2017/07/18 Javascript
json.stringify()与json.parse()的区别以及用处
2021/01/25 Javascript
[03:17]2014DOTA2 国际邀请赛中国区预选赛 四强专访
2014/05/23 DOTA
[57:55]完美世界DOTA2联赛PWL S3 Magma vs Phoenix 第二场 12.12
2020/12/16 DOTA
Python爬虫辅助利器PyQuery模块的安装使用攻略
2016/04/24 Python
python设计模式大全
2016/06/27 Python
浅谈django开发者模式中的autoreload是如何实现的
2017/08/18 Python
Window10+Python3.5安装opencv的教程推荐
2018/04/02 Python
解决Spyder中图片显示太小的问题
2018/04/27 Python
使用python将时间转换为指定的格式方法
2018/11/12 Python
python使用requests模块实现爬取电影天堂最新电影信息
2019/04/03 Python
Python 添加文件注释和函数注释操作
2020/08/09 Python
css3给背景图片加颜色遮罩的方法
2019/11/05 HTML / CSS
HTML5实现Notification API桌面通知功能
2016/03/02 HTML / CSS
阿提哈德航空官方网站:Etihad Airways
2017/01/06 全球购物
日本热销NO.1胶原蛋白冻:Aishitoto爱希特多
2019/06/20 全球购物
大学军训感言600字
2014/02/25 职场文书
教师教学评估方案
2014/05/09 职场文书
啦啦队口号大全
2014/06/16 职场文书
学习十八届四中全会精神思想汇报
2014/10/23 职场文书
2014年个人工作总结模板
2014/12/15 职场文书
应届生求职自荐信范文
2015/03/04 职场文书
2015年学生会纪检部工作总结
2015/03/31 职场文书
志愿者服务活动总结报告
2015/05/06 职场文书
2015年城市管理工作总结
2015/05/23 职场文书
公司趣味运动会开幕词
2016/03/04 职场文书
vue实现水波涟漪效果的点击反馈指令
2021/05/31 Vue.js