php魔术方法总结_第1页
php魔术方法总结_第2页
php魔术方法总结_第3页
php魔术方法总结_第4页
php魔术方法总结_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文格式为Word版,下载可任意编辑——php魔术方法总结php魔术方法总结

1、操作类私有属性的方法:

__GET()获取私有属性的值__SET()设置私有属性的值__ISSET()判断是否存在该属性__UNSET()删除该属性使用例如:

classPerson{

//私有成员

private$name;//人名private$sex;//性别private$age;//年龄

//__get()方法用来获取私有属性

privatefunction__get($property_name){

if(isset($this->$property_name)){

return$this->$property_name;}else{

returnNULL;}}

//__set()方法用来设置私有属性

privatefunction__set($property_name,$value){

$this->$property_name=$value;return$this;}

}

2、__call()

监控一个对象中方法调用状况,若调用了不存在的、不在权限内的方法,会自动执行__call()中内容。

3、__autoload()

在该类实例化之前,自动加载所需的文件,使用例如:function__autoload($classname){

$classpath=\if(file_exists($classpath)){

require_once($classpath);}else{

die(‘classfile’.$classpath.’notfound!’);

}

}

注意__autoload()抛出的异常不能被catch语句块捕获并导致致命错误。

4、__construct()和__destruct()

类的构造函数和析构函数,类实例化默认执行的代码全在__construct()里面。

__destruct()析构方法,PHP将在对象被销毁前(即从内存中清除前)调用这个方法默认状况下,PHP仅仅释放对象属性所占用的内存并销毁对象相关的资源.析构函数允许你在使用一个对象之后执行任意代码来清除内存.当PHP决定你的脚本不再与对象相关时,析构函数将被调用.在一个函数的命名空间内,这会发生在函数return的时候.对于全局变量,这发生于脚本终止的时候.假使你想明确地销毁一个对象,你可以给指向该对象的变量分派任何其它值.寻常将变量赋值勤为NULL或者调用unset.

5、__clone():

当我们对一个实例化的对象进行浅复制时,对象内基本数值类型进行的是传值赋值,对象内的属性是传引用的复制,而不是生成新对象,意味着原对象属性值改变时,复制的对象属性值也会改变。

但是对__clone()处理过的属性,不会随源对象相应属性值的改变而改变。例子:

classAccount{

public$balance;

publicfunction__construct($balance){$this->balance=$balance;}}

classPerson{private$id;private$name;private$age;public$account;

publicfunction__construct($name,$age,Account$account){$this->name=$name;$this->age=$age;

$this->account=$account;}

publicfunctionsetId($id){$this->id=$id;}

publicfunction__clone(){#复制方法,可在里面定义再clone是进行的操作

$this->id=0;

$this->account=clone$this->account;#不加这一句,account在clone是会只被复制引用,其中一个account的balance被修改另一个也同样会被修改}}

$person=newPerson(\$person->setId(1);

$person2=clone$person;

$person2->account->balance=250;

var_dump($person,$person2);5、__toString():

若类中定义__toString(),则该类实例化的对象,在被echo/print等输出该对象时,会自动返回__toString(){}中return的结果,不会报“对象不是字符串不能打印输出〞之类的错误。

例如:

//DeclareasimpleclassclassTestClass{

public$foo;

publicfunction__construct($foo){$this->foo=$foo;}

//定义一个__toString方法,返加一个成员属性$foopublicfunction__toString(){return$this->foo;}}

$class=newTestClass('Hello');

//直接输出对象

echo$class;

6、__sleep():串行化时候调用

__wakeup():反串行化时候调用

串行化基础知识:是指将一个变量(包括对象)转换成字节流的过程。串行化有效的解决了对象的保存和传输的问题。譬如使用session过程中用session_register()注册对象,则每个php页面终止的时候都会自动序列化,并在后面加载的页面中自动解序列化出对象(serializeunserialize)。可处理除指针外的所有数据类型。

反序列化时注意,所在的页面必需存在对该类的定义,否则就成了stdClass空类。

进行序列化之前,会检查该类中是否有__sleep函数,__sleep()必需返回一个需要序列化保存的成员属性数组,并且只序列化该函数返回的这些成员属性。两大作用:1、序列化之前关闭任何可能的数据库连接2、不需要被序列化的成员属性不必放在返回的属性数组中。

反序列化从字节流中创立对象后,马上检查__wakeup()是否存在并调用其中内容,作用为:重建序列化过程中可能丢失的数据库连接,其他初始化任务。

一般__wakeup()要处理序列化过程中__sleep()没有进行保存的对象属性。

例如:

classUser{public$name;public$id;function__construct(){$this->id=uniqid();//giveuserauniqueID赋予一个不同的ID}function__sleep(){return(array('name'));//donotserializethis->id不串行化id}function__wakeup(){$this->id=uniqid();//giveuserauniqueID}}

$u=newUser;

$u->name='HAHA';

$s=serialize($u);//serializeit串行化注意不串行化id属性,id的值被抛弃

$u2=unserialize($s);//unserializeit反串行化id被重新赋值//$uand$u2havedifferentIDs$u和$u2有不同的IDvar_dump($u);var_dump($u2);

7、__set_state():

该函数只在php5.3及以后出现。

在调用var_export()函数时接收数组参数,最大作用是复制一个对象。例如:classTest{

public$a;

staticfunction__set_state($array){//必需是静态方法,参数是一个数组

$tmp=newTest();$tmp->a=$array['a'];//直接赋值return$tmp;//必需返回一个对象,可以是其他类的对象}}

$test=newTest();$test->a='我是$test';

eval('$b='.var_export($test,true).';');var_dump($b);

该例子会输出:object(Test)#2(1){[\我是$test\

8、__invoke():

Php5.3以后新增的魔术方法。

作用是创立实例后可以直接调用对象。(以函数方式)例如:

classtestClass{

publicfunction__invoke($x){

Echo‘datais:’.$x;}}

$obj=newtestClass;$obj(5);

9、__debugInfo():

php5.6及以后才有该方法。

__debugInfo中可以将类的所有属性值输出。例如:classC{

private$prop;

publicfunctio

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论