基于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 相关文章推荐
IIS+PHP+MySQL+Zend配置 (视频教程)
Dec 13 PHP
关于BIG5-HKSCS的解决方法
Mar 20 PHP
php str_replace的替换漏洞
Mar 15 PHP
ThinkPHP中实例Model方法的区别说明
Aug 21 PHP
抓取并下载CSS中所有图片文件的php代码
Sep 26 PHP
基于php iconv函数的使用详解
Jun 09 PHP
php数组查找函数in_array()、array_search()、array_key_exists()使用实例
Apr 29 PHP
php多次include后导致全局变量global失效的解决方法
Feb 28 PHP
php发送短信验证码完成注册功能
Nov 24 PHP
PHP7中I/O模型内核剖析详解
Apr 14 PHP
PHP使用HTML5 FileApi实现Ajax上传文件功能示例
Jul 01 PHP
Memcached介绍及php-memcache扩展安装
Apr 01 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
从网上搜到的phpwind 0day的代码
2006/12/07 PHP
php preg_match_all结合str_replace替换内容中所有img
2008/10/11 PHP
php源码分析之DZX1.5随机数函数random用法
2015/06/17 PHP
PHP 将数组打乱 shuffle函数的用法及简单实例
2016/06/17 PHP
PHP面向对象程序设计组合模式与装饰模式详解
2016/12/02 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
2020/04/02 PHP
PHP 扩展Memcached命令用法实例总结
2020/06/04 PHP
showModelessDialog()使用详解
2006/09/07 Javascript
JavaScript Event学习第十章 一些可替换的事件对
2010/02/10 Javascript
js 页面元素的几个用法总结
2013/11/18 Javascript
浅析IE10兼容性问题(frameset的cols属性)
2014/01/03 Javascript
JavaScript设计模式之外观模式实例
2014/10/10 Javascript
Javascript基础教程之switch语句
2015/01/18 Javascript
JS实现浏览器打印、打印预览示例
2017/02/28 Javascript
jquery DataTable实现前后台动态分页
2017/06/17 jQuery
Vue数组更新及过滤排序功能
2017/08/10 Javascript
关于预加载InstantClick的问题解决方法
2017/09/12 Javascript
简易Vue评论框架的实现(父组件的实现)
2018/01/08 Javascript
js canvas画布实现高斯模糊效果
2018/11/27 Javascript
小程序云开发如何实现图片上传及发表文字
2019/05/17 Javascript
javascript-hashchange事件和历史状态管理实例分析
2020/04/18 Javascript
vue+element-ui表格封装tag标签使用插槽
2020/06/18 Javascript
解决vuex刷新数据消失问题
2020/11/12 Javascript
js canvas实现五子棋小游戏
2021/01/22 Javascript
[01:20]DOTA2 齐天大圣至宝动态展示
2016/12/13 DOTA
python3下使用cv2.imwrite存储带有中文路径图片的方法
2018/05/10 Python
python实现弹跳小球
2019/05/13 Python
python 比较2张图片的相似度的方法示例
2019/12/18 Python
html5时钟实现代码
2010/10/22 HTML / CSS
岳父生日宴会答谢词
2014/01/13 职场文书
群众路线自查自纠工作情况报告
2014/10/28 职场文书
离职感谢信怎么写
2015/01/22 职场文书
怀孕辞职信怎么写
2015/02/28 职场文书
中标通知书格式
2015/04/17 职场文书
2015年妇联工作总结范文
2015/04/22 职场文书
亮剑精神观后感
2015/06/05 职场文书