__set()和 __get()两个方法用来完成对所有私有属性都能获取和赋值的操作,而__isset()方法用来检查私有属性是否存在,__unset()方法用来删除对象中的私有属性。
1、__set()方法
<?php
class person{
private $name;
private $sex;
private $age;
function __construct($name="",$sex="",$age=""){
$this->name=$name;
$this->sex=$sex;
$this->age=$age;
}
/**
声明魔术方法需要两个参数,直接为私有属性赋值时自动调用,并可以屏蔽一些非法赋值
@param string $propertyname 成员属性名
@param string $propertyvalue 成员属性值
*/
public function __set($propertyname,$propertyvalue){
//如果第一个参数是属性名sex则条件成立
if($propertyname=="sex"){
//第二个参数只能是男或女
if(!($propertyvalue=="男"||$propertyvalue=="女")){
//如果是非法参数返回空,则结束方法运行
return;
}
}
if($propertyname=="age"){
if($propertyvalue>150||$propertyvalue<0){
return;
}
}
//根据参数决定为哪个属性赋值,传入不同的成员属性名,赋上传入的相应的值
$this->$propertyname=$propertyvalue;
}
//下面是声明人类的成员方法,设置为公有就可以在任何地方访问
public function say(){
echo "我的名字:".$this->name.";性别:".$this->sex.";年龄:".$this->age."<br/>";
}
}
$person1= new person("张三","男","40"); //括号中也可以不写
//以下三行自动调用了__set()函数,将属性名传给第一个参数,将值传给第二个参数
$person1->name="李四";
$person1->sex="女";
$person1->age="20";
$person1->say();
?>
程序运行结果为:
我的名字:李四;性别:女;年龄:20; //输出的是私有成员属性被重新设置的新值
2、__get()方法
如果在类中声明了__get()方法,则直接在对象的外部获取私有属性的值时,会自动调用此方法,返回私有属性的值。并且可以在__get()方法中根据不同的属性,设置一些条件来限制对私有属性的非法取值操作。和__set()一样,需要在声明类时自己将它加到类中才可以使用。
class person{
private $name;
private $sex;
private $age;
function __construct($name="",$sex="",$age=""){
$this->name=$name;
$this->sex=$sex;
$this->age=$age;
}
/**
在类中添加__get()方法,在直接获取属性值时自己条用一次,以属性名作为参数传入并处理
@param string $propertyname 成员属性名
@return mixed 返回属性值
*/
public function __get($propertyname){
if($propertyname=="sex"){
return "保密";
}elseif($propertyname=="age"){
if($this->age>30){
return $this->age-10;
}else{
return $this->$propertyname;
}
}else{
return $this->$propertyname;
}
}
}
$person1=new person("张三","男","20");
echo "姓名:".$person1->name."<br/>"; //直接访问私有属性name,自动调用了__get()方法可以间接获取
echo "性别:".$person1->sex."<br/>"; //自动调用了__get()方法,但在方法中没有返回真实属性值
echo "年龄:".$person1->age."<br/>"; //自动调用了__get()方法,根据对象本身的情况会返回不同的值
3、__isset()方法
4、__unset()方法