__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()方法