千家信息网

__set()、 __get() 、__isset()和__unset()四个方法

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,__set()和 __get()两个方法用来完成对所有私有属性都能获取和赋值的操作,而__isset()方法用来检查私有属性是否存在,__unset()方法用来删除对象中的私有属性。1、__set()
千家信息网最后更新 2025年02月01日__set()、 __get() 、__isset()和__unset()四个方法

__set()和 __get()两个方法用来完成对所有私有属性都能获取和赋值的操作,而__isset()方法用来检查私有属性是否存在,__unset()方法用来删除对象中的私有属性。

1、__set()方法

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."
";

}


}


$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."
"; //直接访问私有属性name,自动调用了__get()方法可以间接获取

echo "性别:".$person1->sex."
"; //自动调用了__get()方法,但在方法中没有返回真实属性值

echo "年龄:".$person1->age."
"; //自动调用了__get()方法,根据对象本身的情况会返回不同的值



3、__isset()方法

4、__unset()方法

0