您好,欢迎访问三七文档
当前位置:首页 > 中学教育 > 高中教育 > PHP之十六个魔术方法详解
PHP之十六个魔术方法详解PHP中把以两个下划线__开头的方法称为魔术方法(Magicmethods),这些方法在PHP中充当了举足轻重的作用。作者:佚名来源:segmentfault|2016-10-2715:58收藏分享前言PHP中把以两个下划线__开头的方法称为魔术方法(Magicmethods),这些方法在PHP中充当了举足轻重的作用。魔术方法包括:1.__construct(),类的构造函数2.__destruct(),类的析构函数3.__call(),在对象中调用一个不可访问方法时调用4.__callStatic(),用静态方式中调用一个不可访问方法时调用5.__get(),获得一个类的成员变量时调用6.__set(),设置一个类的成员变量时调用7.__isset(),当对不可访问属性调用isset()或empty()时调用8.__unset(),当对不可访问属性调用unset()时被调用。9.__sleep(),执行serialize()时,先会调用这个函数10.__wakeup(),执行unserialize()时,先会调用这个函数11.__toString(),类被当成字符串时的回应方法12.__invoke(),调用函数的方式调用一个对象时的回应方法13.__set_state(),调用var_export()导出类时,此静态方法会被调用。14.__clone(),当对象复制完成时调用15.__autoload(),尝试加载未定义的类16.__debugInfo(),打印所需调试信息范例下面让我们以实例的形式向大家讲解下这几个魔术方法时如何使用的。一、__construct(),类的构造函数php中构造方法是对象创建完成后第一个被对象自动调用的方法。在每个类中都有一个构造方法,如果没有显示地声明它,那么类中都会默认存在一个没有参数且内容为空的构造方法。1、构造方法的作用通常构造方法被用来执行一些有用的初始化任务,如对成员属性在创建对象时赋予初始值。2、构造方法的在类中的声明格式1.function__constrct([参数列表]){2.3.方法体//通常用来对成员属性进行初始化赋值4.5.}3、在类中声明构造方法需要注意的事项在同一个类中只能声明一个构造方法,原因是,PHP不支持构造函数重载。构造方法名称是以两个下画线开始的__construct()下面是它的例子:1.?php2.classPerson3.{4.public$name;5.public$age;6.public$sex;7.8./**9.*显示声明一个构造方法且带参数10.*/11.publicfunction__construct($name=,$sex=男,$age=22)12.{13.$this-name=$name;14.$this-sex=$sex;15.$this-age=$age;16.}17.18./**19.*say方法20.*/21.publicfunctionsay()22.{23.echo我叫:.$this-name.,性别:.$this-sex.,年龄:.$this-age;24.}25.26.}创建对象$Person1且不带任参数1.$Person1=newPerson();2.3.echo$Person1-say();//输出:我叫:,性别:男,年龄:27创建对象$Person2且带参数“小明”1.$Person2=newPerson(小明);2.3.echo$Person2-say();//输出:我叫:张三,性别:男,年龄:27创建对象$Person3且带三个参数1.$Person3=newPerson(李四,男,25);2.3.echo$Person3-say();//输出:我叫:李四,性别:男,年龄:25二、__destruct(),类的析构函数通过上面的讲解,现在我们已经知道了什么叫构造方法。那么与构造方法对应的就是析构方法。析构方法允许在销毁一个类之前执行的一些操作或完成一些功能,比如说关闭文件、释放结果集等。析构方法是PHP5才引进的新内容。析造方法的声明格式与构造方法__construct()比较类似,也是以两个下划线开始的方法__destruct(),这种析构方法名称也是固定的。1、析构方法的声明格式1.function__destruct()2.3.{4.5.//方法体6.7.}注意:析构函数不能带有任何参数。2、析构方法的作用一般来说,析构方法在PHP中并不是很常用,它属类中可选择的一部分,通常用来完成一些在对象销毁前的清理任务。举例演示,如下:1.?php2.classPerson{3.4.public$name;5.public$age;6.public$sex;7.8.publicfunction__construct($name=,$sex=男,$age=22)9.{10.$this-name=$name;11.$this-sex=$sex;12.$this-age=$age;13.}14.15./**16.*say说话方法17.*/18.publicfunctionsay()19.{20.echo我叫:.$this-name.,性别:.$this-sex.,年龄:.$this-age;21.}22.23./**24.*声明一个析构方法25.*/26.publicfunction__destruct()27.{28.echo我觉得我还可以再抢救一下,我的名字叫.$this-name;29.}30.}31.32.$Person=newPerson(小明);33.unset($Person);//销毁上面创建的对象$Person上面的程序运行时输出:我觉得我还可以再抢救一下,我的名字叫小明三、__call(),在对象中调用一个不可访问方法时调用。该方法有两个参数,第一个参数$function_name会自动接收不存在的方法名,第二个$arguments则以数组的方式接收不存在方法的多个参数。1、__call()方法的格式:1.function__call(string$function_name,array$arguments)2.3.{4.5.//方法体6.7.}2、__call()方法的作用:为了避免当调用的方法不存在时产生错误,而意外的导致程序中止,可以使用__call()方法来避免。该方法在调用的方法不存在时会自动调用,程序仍会继续执行下去。请参考如下代码:1.?php2.classPerson3.{4.functionsay()5.{6.7.echoHello,world!br;8.}9.10./**11.*声明此方法用来处理调用对象中不存在的方法12.*/13.function__call($funName,$arguments)14.{15.echo你所调用的函数:.$funName.(参数:;//输出调用不存在的方法名16.print_r($arguments);//输出调用不存在的方法时的参数列表17.echo)不存在!br\n;//结束换行18.}19.}20.$Person=newPerson();21.$Person-run(teacher);//调用对象中不存在的方法,则自动调用了对象中的__call()方法22.$Person-eat(小明,苹果);23.$Person-say();运行结果:1.你所调用的函数:run(参数:Array([0]=teacher))不存在!2.3.你所调用的函数:eat(参数:Array([0]=小明[1]=苹果))不存在!4.5.Hello,world!四、__callStatic(),用静态方式中调用一个不可访问方法时调用此方法与上面所说的__call()功能除了__callStatic()是未静态方法准备的之外,其它都是一样的。请看下面代码:1.?php2.classPerson3.{4.functionsay()5.{6.7.echoHello,world!br;8.}9.10./**11.*声明此方法用来处理调用对象中不存在的方法12.*/13.publicstaticfunction__callStatic($funName,$arguments)14.{15.echo你所调用的静态方法:.$funName.(参数:;//输出调用不存在的方法名16.print_r($arguments);//输出调用不存在的方法时的参数列表17.echo)不存在!br\n;//结束换行18.}19.}20.$Person=newPerson();21.$Person::run(teacher);//调用对象中不存在的方法,则自动调用了对象中的__call()方法22.$Person::eat(小明,苹果);23.$Person-say();运行结果如下:1.你所调用的静态方法:run(参数:Array([0]=teacher))不存在!2.3.你所调用的静态方法:eat(参数:Array([0]=小明[1]=苹果))不存在!4.5.Hello,world!五、__get(),获得一个类的成员变量时调用在php面向对象编程中,类的成员属性被设定为private后,如果我们试图在外面调用它则会出现“不能访问某个私有属性”的错误。那么为了解决这个问题,我们可以使用魔术方法__get()。魔术方法__get()的作用在程序运行过程中,通过它可以在对象的外部获取私有成员属性的值。我们通过下面的__get()的实例来更进一步的连接它吧:1.?php2.classPerson3.{4.private$name;5.private$age;6.7.function__construct($name=,$age=1)8.{9.$this-name=$name;10.$this-age=$age;11.}12.13./**14.*在类中添加__get()方法,在直接获取属性值时自动调用一次,以属性名作为参数传入并处理15.*@param$propertyName16.*17.*@returnint18.*/19.publicfunction__get($propertyName)20.{21.if($propertyName==age){22.if($this-age30){23.return$this-age-10;24.}else{25.return$this-$propertyName;26.}27.}else{28.return$this-$propertyName;29.}30.}31.}32.$Person=newPerson(小明,60);//通过Person类实例化的对象,并通过构造方法为属性赋初值33.echo姓名:.$Person-name.br;//直接访问私有属性name,自动调用了__get()方法可以间接获取34.echo年龄:.$Person-age.br;//自动调用了__get()方法,根据对象本身的情况会返回不同的值运行结果:1.姓名:小明2.3.年龄:50六、__set(),设置一个类的成员变量时调用__set()的作用:__set($property,$value)`方法用来设置私有属性,给一个未定义的属性赋值时,此方法会被触发,传递的参数是被设置的属性名和值。请看下面的演示代码:1.?php2.classPerson3.{4.private$name;5.private$age;6.7.publicfunction__construct($name=,$age=25)8.{9.$this-name=$name;10.$this-age=$age;11.}12.13./**14.*声明魔术方法需要两个参数,真接为私有属性赋值时自动调用,并可以屏蔽一些非法赋值15.*@param
本文标题:PHP之十六个魔术方法详解
链接地址:https://www.777doc.com/doc-2850378 .html