打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
PHP 魔术方法之“
userphoto

2016.05.28

关注

__set()方法:

这个方法用来为私有成员属性设置值的,有两个参数,第一个参数为你要为设置值的属性名,第二个参数是要给属性设置的值,没有返回值。

这个方法同样不用我们手工去调用,它也可以做成私有的,是在直接设置私有属性值的时候自动调用的,同样属性私有的已经被封装上了,如果没有__set()这个方法,是不允许的,比如在类外使用$this->name=‘zhangsan’,这样会出错,但是如果你在类里面加上了__set($property_name, $value)这个方法,在直接给私有属性赋值的时候,就会自动调用它,把属性比如name传给$property_name,把要赋的值“zhangsan”传给$value,通过这个方法的执行,达到赋值的目的。
如果成员属性不封装成私有的,对象本身就不会去自动调用这个方法。为了不传入非法的值,还可以在这个方法给做一下判断。

注意:__set()方法操作的变量必须是私有变量。 

实例代码:

  1. <span style="font-size:18px;"><?php</span>  
  1. <span style="font-size:18px;">class person{  
  2.     private $name;       //第一个成员属性$name定义人的名子,此属性被封装  
  3.     private $sex;         //第二个成员属性$sex定义人的性别,此属性被封装  
  4.     private $age;         //第三个成员属性$age定义人的年龄,此属性被封装  
  5.     function __construct($name,$sex,$age){  
  6.         $this->name=$name;  
  7.         $this->sex=$sex;  
  8.         $this->age=$age;  
  9.     }  
  10.     //声明魔术方法需要两个参数,真接为私有属性赋值时自动调用,并可以屏蔽一些非法赋值  
  11.     public function __set($propertyName, $propertyValue) {  
  12.         if($propertyName=="sex"){        //如果第一个参数是属性名sex则条件成立  
  13.             //对于非法数据的处理  
  14.             if(!($propertyValue == "男" || $propertyValue == "女"))  //第二个参数只能是男或女  
  15.                 return;                //如果是非法参数返回空,则结束方法执行  
  16.             else  
  17.                 $this->$propertyName = $propertyValue;  
  18.         }      
  19.         if($propertyName=="age"){        //如果第一个参数是属性名age则条件成立  
  20.             if($propertyValue > 150 || $propertyValue <0)  //第二个参数只能在0到150之间的整数  
  21.                 return;                //如果是非法参数返回空,则结束方法执行  
  22.             else  
  23.                 $this->$propertyName = $propertyValue;  
  24.         }  
  25.         if($propertyName=="name"){  
  26.             //对于不需要进行验证的数据,根据参数决定为那个属性被赋值,传入不同的成员属性名,赋上传入的相应的值,定义赋值的方式.  
  27.             $this->$propertyName = $propertyValue;  
  28.         }  
  29.         echo $this->name; //此时输出的名字为李四  
  30.     }  
  31.     public function showInfo() {  
  32.         echo $this->name;  
  33.     }  
  34. }  
  35.          
  36.   
  37. //调用__set()方法:  
  38. $per=new Person("张三", "男", 20);  
  39. $per->showInfo(); //此时输出的名字为张三  
  40. //自动调用了__set()函数,将属性名name传给第一个参数,将属性值”李四”传给第二个参数  
  41. $per->name="李四";      //当进行赋值时,它会自动调用__set中的 $this->propertyName=$propertyValue代码<span style="white-space:pre"> </span></span>  
  1. <span style="font-size:18px;">?></span>  

__get()方法:

这个方法用来获取私有成员属性值的,有一个参数,参数传入你要获取的成员属性的名称,返回获取的属性值,这个方法不用我们手工的去调用,因为我们也可以把这个方法做成私有的方法,是在直接获取私有属性的时候对象自动调用的。 
实例代码:

  1. <span style="font-size:18px;"><?php  
  2. class person1{  
  3.     private $name="王五";  
  4.     private $sex="男";  
  5.     private $age="90";  
  6.     //在类中添加__get()方法,在直接获取属性值时自动调用一次,以属性名作为参数传入并处理  
  7.     public function __get($propertyName)  {    //在方法前使用private修饰,防止对象外部调用   
  8.         if($propertyName=="sex") {          //如果参数传入的是”sex”则条件成立  
  9.             return "保密";                  //不让别人获取到性别,以“保密”替代  
  10.         }   
  11.          else  if($propertyName=="age") {    //如果参数传入的是“age”则条件成立  
  12.             if($this->age > 30)               //如果对象中的年龄大于30时条件成立  
  13.                 return $this->age-10;           //返回对象中虚假的年龄,比真实年龄小10岁  
  14.             else                           //如果对象中的年龄不大于30时则执行下面代码  
  15.                 return $this->$propertyName;  //让访问都可以获取到对象中真实的年龄  
  16.         }   
  17.         else{                            //如果参数传入的是其它属性名则条件成立  
  18.             return $this->$propertyName;      //对其它属性都没有限制,可以直接返回属性的值  
  19.         }    
  20.     }  
  21.     public function __set($propertyName, $propertyValue) {  
  22.         if($propertyName=="sex"){        //如果第一个参数是属性名sex则条件成立  
  23.             //对于非法数据的处理  
  24.             if(!($propertyValue == "男" || $propertyValue == "女"))  //第二个参数只能是男或女  
  25.                 return;                //如果是非法参数返回空,则结束方法执行  
  26.             else  
  27.                 $this->$propertyName = $propertyValue;  
  28.         }      
  29.         if($propertyName=="age"){        //如果第一个参数是属性名age则条件成立  
  30.             if($propertyValue > 150 || $propertyValue <0)  //第二个参数只能在0到150之间的整数  
  31.                 return;                //如果是非法参数返回空,则结束方法执行  
  32.             else  
  33.                 $this->$propertyName = $propertyValue;  
  34.         }  
  35.         if($propertyName=="name"){  
  36.             //对于不需要进行验证的数据,根据参数决定为那个属性被赋值,传入不同的成员属性名,赋上传入的相应的值,定义赋值的方式.  
  37.             $this->$propertyName = $propertyValue;  
  38.         }  
  39.     }  
  40. }  
  41.   
  42.   
  43.   
  44. /*  
  45. 说明: 
  46. 1.它只有一个参数.就是属性名. 
  47. 2.这里的关键代码 return $this->$propertyName,即为真正得到属性值的代码. 
  48. */  
  49. $per1=new Person1();  
  50. echo "<br>性别:".$per1->sex."<br>";   //它会自动的调用,特别是__get()方法中的$per1即为$this.  
  51. echo "<br>姓名:".$per1->name."<br>";   //它会自动的调用,特别是__get()方法中的$per1即为$this.  
  52. echo "<br>年龄:".$per1->age."<br>";   //它会自动的调用,特别是__get()方法中的$per1即为$this.                  
  53. ?>   </span>  

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
PHP之十六个魔术方法详解
魔术方法2
Linux 宝库 - 利用反射简化Struts的ActionForm的验证
10.
leaflet 结合 geoserver 实现地图属性查询(附源码下载)
【投稿】利用Runtime 实现自动化归档
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服