首页> 基础笔记 >PHP基础学习 >面向对象 面向对象

PHP面向对象之魔术方法__set()、__get()、__isset()和__unset()

作者:小萝卜 2019-08-31 浏览 905

简介魔术方法:__set(): 用于替代通用的set赋值方法 ,__get(): 用于替代通用的get取值方法,__isset(): 检测对象中成员属性是否存在,__unset(): 销毁对象中成员属性方法

魔术方法:

__set(): 用于替代通用的set赋值方法 

__get(): 用于替代通用的get取值方法

__isset(): 检测对象中成员属性是否存在

__unset(): 销毁对象中成员属性方法

注意:

上面四个魔术方法只对类中的私有、受保护成员属性有效。

魔术方法前的修饰符可以是公有、私有,不影响调用。

__set( )方法:

格式 [修饰符] function __set(string $name,mixed $value){ ...   }

当我们直接为一个对象中非公有属性赋值时会自动调用此方法,并将属性名以第一个参数(string),值作为第二参数(mixed)传进此方法中。

__get( )方法:

格式:[修饰符] function __get(string $name){   ...    }

当我们直接输出一个对象中非公有属性时会自动调用此方法,并将属性名以第一个参数传进去。

<?php
    class Person  {                         
        	//下面是声明人的成员属性,全都使用了private关键字封装
        	private $name;                //此属性被封装
        	private $sex;                   //此属性被封装
	//声明魔术赋值方法;$propertyName :成员属性名、$propertyValue :成员属性值
        	private function __set($propertyName, $propertyValue) { 
            	     $this->$propertyName = $propertyValue; 
                } 
	//声明魔术取值方法;$propertyName :成员属性名
        	private function __get($propertyName) { 
            	     return $this->$propertyName; 
                } 
     }
    $person1 = new Person( ); 
    $person1->name = “李四”;      //自动调用了__set()方法为私有属性name赋值
    $person1->sex = “女”;             //自动调用了__set()方法为私有属性sex赋值
    
    echo $person1->name;          //自动调用魔术方法__get( )获取属性name值
    echo $person1->age ;            //自动调用魔术方法__get( )获取属性sex值


__isset( )方法:

格式: [修饰符] function __isset(string $name){  ...   }

当使用isset()或empty()判断一个对象的私有或受保护的属性是否存在时,会自动调用此方法。参数name表示被判断的属性名。

__unset( )方法:

格式: [修饰符] function __unset(string $name){   ...    }

当使用unset( )销毁一个对象的私有或受保护的属性时,自动调用此方法,并将属性名以第一个参数传进去。

<?php
    class Person  {                     
        private $name;      //此属性被封装
        private $sex;         //此属性被封装
        public function __construct($name="", $sex="男") {
            $this->name = $name;                
            $this->sex = $sex;
        }
        private function __isset($propertyName) {   //需要一个参数,是测定的私有属性的名称
            return isset($this->$propertyName);     //其他的属性都可以被测定,并返回测定的结果
        }
        private function __unset($propertyName) {   //需要一个参数,是要删除的私有属性名称
            if($propertyName == "name")           //如果参数中传入的属性名等于“name”时条件成立
                return;                             	     //退出方法,不允许删除对象中的name属性
            unset($this->$propertyName);         //在对象的内部删除在对象外指定的私有属性
        }
    }
    $person1 = new Person("张三", "男");   //创建一个对象$person1,将成员属性分别赋上初值
    var_dump( isset( $person1->name ) );     //输出bool(true),不允许测定name属性
    var_dump( isset( $person1->sex ) );        //输出bool(true),存在sex私有属性
    var_dump( isset( $person1->id ) );           //输出bool(false),测定对象中不存在id属性
    unset( $person1->name );                        //删除私有属性name,但在__unset()中不允许删除
    unset( $person1->sex );                           //删除对象中的私有属性sex,删除成功
 

 

很赞哦! (0)

文章评论

    高端网站建设