zoukankan      html  css  js  c++  java
  • 对象的封装特性

    一、什么是封装?

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

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

    二、修饰词

      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();

    三、魔术方法

      ①__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();
  • 相关阅读:
    解决undefined reference to `__poll_chk@GLIBC_2.16' 错误
    交叉编译总结 libosscore.a libcurl.a libmysqlclient.a
    APUE环境配置
    UDT中epoll对CLOSE状态的处理
    查看ld搜索路径
    linux shell 比较文件夹内容 diff
    交互式makefile
    linux shell取文本最后一行
    linux 查看静态库,动态库是32位还是64位
    python学习day4之路
  • 原文地址:https://www.cnblogs.com/zhouwanqiu/p/9588737.html
Copyright © 2011-2022 走看看