对象的封装特性

Posted zhouwanqiu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对象的封装特性相关的知识,希望对你有一定的参考价值。

四、对象的封装特性

  1)什么是封装?

    就是将对象的成员隐藏起来,不让其直接在类的外部访问,要通过一定的方法对封装起来的成员进行访问控制;

    面向对象的封装特性并不是不让成员被访问,而是要对其进行访问控制;

  2)修饰词

    var  公有的(过时)

      可以在类的外部直接通过对象访问(赋值和输出);在类的内部可以通过$this来进行访问;

    public  公有的

      等同于var;既可以修饰成员属性,又可以修饰成员方法;public修饰的成员在类的外部可以使用对象来调用,在类的内部使用$this进行访问;成员方法如果没有修饰词,默认为public修饰;

    protected  受保护的

      protected修饰的成员在类的外部不允许直接通过类的对象访问;protected修饰的成员在类的内部可以通过$this关键字来进行访问;protected修饰的成员在子类当中可以使用;

    private  私有的

      private修饰的成员在类的外部不允许直接通过类的对象访问;private修饰的成员在类的内部可以通过$this关键字来进行访问;private修饰的成员在子类当中不能使用;

class Person{
    //public声明的成员属性和成员方法可以在类的外部直接调用,在类的内部也可访问

    //[成员属性]
    public $name;
    private $sex;
    private $age;

    //[成员方法]
    
    function set($key,$val){
        if($key=="sex"){
            if($val==="男" || $val==="女" || $val==="保密"){
                $this->sex=$val;
            }else{
                echo "性别只能为男、女或保密!";
            }
        }
        if($key=="age"){
            if(is_int($val) && 0<$val && $val<150){
                $this->age=$val;
            }else{
                echo "年龄只能为0~150的整数!";
            }
        }

        //return $this;
    }

    function info(){
        echo "姓名:".$this->name.",性别:".$this->sex.",年龄:".$this->age;
    }
}

$person=new Person;

$person->name="autumn";
$person->set("sex","男");
$person->set("age",25);

//$person->set("sex","男")->set("age",25);

$person->info();

  3)魔术方法

    ①__set

      参数:两个(属性的名称、属性的值)

      触发时机:当对受保护的成员属性、私有的成员属性、未定义的成员属性进行赋值时会自动调用,并且将成员属性的名称传递给第一个参数,将成员属性要赋的值传递给第二个参数;

      作用:对受保护的、私有的、未定义的成员属性进行赋值控制

    ②__get

      参数:一个(接收要取值的属性的名称)

      触发时机:当对受保护的、私有的、未定义的成员属性进行取值操作的时候会自动调用,并且将成员属性的名称传递给该方法;

      作用:对受保护的、私有的、未定义的成员属性进行取值控制

class Person{
    //[成员属性]
    public $name;
    private $sex;
    private $age;

    //[成员方法]
    function __set($key,$val){
        //判断要设置的成员属性是否存在
        if(!property_exists(__CLASS__, $key)){
            echo $key." is not exists";
            return false;
        }

        if($key=="sex"){
            if($val==="男" || $val==="女" || $val==="保密"){
                $this->sex=$val;
            }else{
                echo "性别只能为男、女或保密!";
            }
        }
        if($key=="age"){
            if(is_int($val) && 0<$val && $val<150){
                $this->age=$val;
            }else{
                echo "年龄只能为0~150的整数!";
            }
        }

    }

    function __get($proName){
        if(!property_exists(__CLASS__, $proName)){
            return $proName." is not exists";
        }
        if($proName=="sex"){
            return $this->sex;
        }
        if($proName=="age"){
            return $this->age;
        }
    }

    function info(){
        echo "姓名:".$this->name.",性别:".$this->sex.",年龄:".$this->age;
    }
}

$person=new Person;

//name是公有的,可以直接在类的外部访问
$person->name="autumn";
//sex和age是受保护的或是私有的,会调用__set方法进行赋值
$person->sex="男";
$person->age=25;

//name是公有的,可以直接输出该属性的值
echo $person->name;
//sex和age是受保护的或是私有的,不能直接在类的外部访问,会调用__get获取属性的值
echo $person->sex;
echo $person->age;

var_dump($person);

    ③__isset

      参数:一个(属性的名称)

      触发时机:当对受保护的、私有的、未定义的成员属性进行isset或empty函数进行判断的时候自动调用;

      作用:对受保护的、私有的、未定义的成员属性进行isset或empty的判断控制

      注意:要有返回值、返回值为true或false

    ④__unset

      参数:一个(属性的名称)

      触发时机:当对受保护的、私有的成员属性进行unset销毁的时候自动调用,并将属性的名称以参数的形式传递

      作用:对受保护的、私有的成员属性进行unset控制

class Person{
    //[成员属性]
    public $name="autumn";
    protected $sex="男";
    private $age=25;

    //[成员方法]
    function __isset($proName){
        if($proName=="sex"){
            return true;
        }
        if($proName=="age"){
            return true;
        }
    }

    function __unset($proName){
        if($proName=="sex"){
            unset($this->sex);
        }
        if($proName=="age"){
            unset($this->age);
        }
    }

    function info(){
        echo "姓名:".$this->name.",性别:".$this->sex.",年龄:".$this->age;
    }
}

$person=new Person;

var_dump(isset($person->name));//不会调用__isset()
echo "<hr>";
var_dump(empty($person->name));//不会调用__isset()
echo "<hr>";
var_dump(isset($person->sex));//自动调用__isset()
echo "<hr>";
var_dump(empty($person->sex));//自动调用__isset()
echo "<hr>";
var_dump(isset($person->age));//自动调用__isset()
echo "<hr>";
var_dump(empty($person->age));//自动调用__isset()
echo "<hr>";

unset($person->name);//不会调用__unset()

unset($person->sex);//自动调用__unset()
unset($person->age);//自动调用__unset()

$person->info();

 

以上是关于对象的封装特性的主要内容,如果未能解决你的问题,请参考以下文章

面向对象的三大特性:继承封装多态

三大特性:封装,继承,多态

面向对象之:三大特性:继承(已讲),封装,多态

Python面向对象之:三大特性:继承,封装,多态。

面向对象三大特性: 封装

19.Python面向对象之:三大特性:继承,封装,多态。