当前位置: 首页 > 后端技术 > PHP

PHP分析中十六个魔术方法详解

时间:2023-03-29 20:52:54 PHP

在PHP中,以两个下划线__开头的方法被称为魔术方法(Magicmethods),这些方法在PHP中起着举足轻重的作用。魔术方法包括:__construct()、类构造函数__destruct()、类析构函数__call()、调用对象中不可访问的方法时调用__callStatic()、以静态方式调用不可访问的方法时调用__get()。__set()在获取类的成员变量时调用,__isset()在设置类的成员变量时调用,__isset()在调用isset()或empty()时调用不可访问属性_unset(),当对不可访问属性调用unset()时调用它。__sleep(),当执行serialize()时,会先调用__wakeup()这个函数,当执行unserialize()时,会先调用__toString()这个函数,当类被当成是时的响应方法__invoke()一个字符串,调用函数的方法调用对象的响应方法__set_state(),调用var_export()导出类时,会调用这个静态方法。__clone(),对象拷贝完成后调用__autoload(),尝试加载未定义的类__debugInfo(),打印需要的调试信息__construct通常用于执行一些有用的初始化任务,比如成员属性创建时赋予初始值物体。2、类函数中构造方法的声明格式__constrct([参数列表]){方法体//通常用于对成员属性进行初始化赋值}3、声明构造方法的注意事项在类中1.在同一个类中只能声明一个构造函数,因为PHP不支持构造函数重载。2.构造方法的名字以两个下划线开头__construct()下面是一个例子:classPerson{public$name;公共$年龄;公共$性;/***显示并声明一个带有参数的构造方法*/publicfunction__construct($name="",$sex="male",$age=22){$this->name=$name;$this->sex=$sex;$this->age=$age;}/***say方法*/publicfunctionsay(){echo"Myname:".$这个->名字。“,性别:”。$这个->性。“,年龄:”。$这个->年龄;}}创建不带任何参数的对象$Person1$Person1=newPerson();echo$Person1->say();//输出:mynameis:,gender:male,age:27createobject$Person2withparameter"XiaoMing"$Person2=newPerson("XiaoMing");echo$Person2->say();//输出:我叫:张三,性别:男,年龄:27创建对象$Person3,带三个参数$Person3=newPerson("李四","男",25);echo$Person3->say();//输出:我叫:李四,性别:男,年龄:25__destruct通过上面的解释,现在我们已经知道什么叫构造方法,那么对应的构造方法就是destruct方法。析构方法允许在销毁一个类之前执行一些操作或执行一些功能,例如关闭文件、释放结果集等。析构方法是PHP5引入的新内容。析构方法的声明格式与构造方法__construct()类似。它也是以两个下划线开头的方法__destruct()。这个析构方法的名字也是固定的。1、析构函数方法的声明格式function__destruct(){//方法体}注意:析构函数不能有任何参数。2.析构方法的作用一般来说,析构方法在PHP中并不是很常用。它是类的可选部分,通常用于在对象被销毁之前完成一些清理任务。示例演示如下:classPerson{public$name;公共$年龄;public$sex;publicfunction__construct($name="",$sex="Male",$age=22){$this->name=$name;$this->sex=$sex;$this->age=$age;}/**say说话方式*/publicfunctionsay(){echo"Mynameis:".$this->name.",Gender:".$this->sex.",Age:".$this->age;}/**声明一个析构方法*/publicfunction__destruct(){echo"我想我可以再保存一次,我的名字是".$this->name;}}$Person=newPerson("小明");取消设置($人);//销毁上面创建的对象$Person上面程序在运行时的输出:我想我又可以救回来了。我叫小明。__call在对象中调用不可访问的方法时,有两个参数来调用该方法。第一个参数$function_name会自动接收不存在的方法名,第二个$arguments则以数组的形式接收多个不存在的方法的参数。1.__call()方法的格式:function__call(string$function_name,array$arguments){//方法体}2.__call()方法的功能:为了避免被调用的方法没有调用时出错exist,unexpected导致程序中止,可以使用__call()方法来避免。当调用的方法不存在时会自动调用该方法,程序继续执行。请参考以下代码:run("老师");//调用对象中不存在的方法,然后自动调用对象中的_call()方法$Person->eat("XiaoMing","Apple");$人->说();运行结果:你调用的函数:run(parameter:Array([0]=>teacher))不存在!你调用的函数:eat(parameter:Array([0]=>XiaoMing[1]=>Apple))不存在!你好世界!__callStatic当以静态方式调用不可访问的方法时,调用此方法与上面提到的__call()函数相同,只是__callStatic()不是静态方法准备的。请看下面的代码:说();运行结果如下:你调用的静态方法:run(parameter:Array([0]=>teacher))不存在!你调用的静态方法:eat(parameter:Array([0]=>XiaoMing[1]=>Apple))不存在!__get在获取类的成员变量时被调用在php面向对象编程中,类的成员属性设置为private后,如果我们尝试在外部调用它,会出现“无法访问私有属性”的错误.那么,要解决这个问题,我们可以使用神奇的方法__get()。魔术方法__get()的作用在程序运行过程中,可以用来获取对象外部私有成员属性的值。让我们进一步将它与以下__get()实例联系起来:classPerson{private$name;私人$年龄;函数__construct($name="",$age=1){$this->name=$name;$this->age=$age;}/**在类中添加一个__get()方法,直接获取属性值时自动调用一次,并将属性名作为参数传入并处理@param$propertyName*@returnint*/publicfunction__get($propertyName){if($propertyName=="age"){if($this->age>30){return$this->age-10;}else{return$this->$propertyName;}}else{return$this->$propertyName;}}}$Person=newPerson("小明",60);//通过Person类实例化对象,并通过构造函数为属性赋值初始值echo"Name:".$人->名字。"";//直接访问私有属性名,自动调用__get()方法间接获取echo"Age:".$人->年龄。"";//自动调用__get()方法,会根据对象本身返回不同的值。运行结果:姓名:小明年龄:50__set设置类成员变量时调用__set($property,$value)`方法用于设置私有属性。当给一个未定义的属性赋值时,会触发该方法,传递的参数是要设置的属性名和值。请看下面的演示代码:classPerson{private$name;私人$年龄;公共函数__construct($name="",$age=25){$this->name=$name;$this->age=$age;}/**声明魔术方法需要两个参数,直接给私有属性赋值时会自动调用,可以屏蔽一些非法赋值@param$property@param$值*/publicfunction__set($property,$value){if($property=="age"){如果($value>150||$value<0){返回;}}$this->$property=$value;}/**在类方法中声明语言,说出所有私有属性*/publicfunctionsay(){echo"Mynameis".$this->name.",今年".$this->age."老了";}}$Person=newPerson("小明",25);//注意下面会改变初始值//自动调用__set()函数,属性名传给第一个参数,属性值为“李四”传给第二个参数$Person->name="小红";//赋值成功。如果没有__set()则出错。//自动调用__set()函数,第一个参数传递属性名age,第二个参数传递属性值26$Person->age=16;//赋值成功$Person->age=160;//160是非法值,赋值无效$Person->say();//输出:我叫小红,今年16岁运行结果:我叫小红,今年16岁__isset不正确访问属性时调用isset()或empty()时调用。在看这个方法之前,我们先看一下isset()函数的应用。isset()是用于确定变量是否已设置的函数。传入一个变量作为参数。如果变量存在则返回真,否则返回假。那么如果在对象外部使用isset()函数来判断对象中的成员是否被设置,是否可以使用呢?有两种情况。如果对象中的成员是public的,我们可以用这个函数来判断成员属性。如果是私有成员属性,这个函数就不起作用。原因是因为private成员被封装了,对外是Invisible的。那么我们就不能在对象外部使用isset()函数来判断私有成员属性是否被设置了吗?当然有可能,但不是一成不变的。您只需要在类中添加一个__isset()方法。当在类外使用isset()函数判断是否设置了对象中的私有成员时,会自动调用类中的__isset()。该方法帮助我们完成这样的操作。__isset()的作用:当对不可访问的属性调用isset()或empty()时,会调用__isset()。请看下面的代码演示:classPerson{public$sex;私人的名字;私人$年龄;公共函数__construct($name="",$age=25,$sex='male'){$this->name=$name;$this->age=$age;$this->sex=$sex;}/**@param$content*@returnbool*/publicfunction__isset($content){echo"当在类外使用时isset()函数确定私有成员时{$content},它会被自动调用";echoisset($this->$content);}}$person=newPerson("小明",25);//初始赋值echoisset($person->sex),"";echoisset($person->name),"";echoisset($person->age),"";运行结果如下://publiccanisset()wheninclass当外部使用isset()函数判断私有成员名时,会自动调用第一个echo1in__isset()//第二个echo在__isset()类外使用issetQQ群时,旨在创造一个繁荣的PHP世界...