zoukankan      html  css  js  c++  java
  • 2019-07-23 类的封装性

    类的封装性,简单来说就是在属性和方法前加了一个限定词,在php中有三个限定词:public(公共的)、protected(被保护的)、private(私有的),如果属性前加了任何一个限制词var要省略。它们具体有什么区别呢?它们的关系又是什么呢?下面做一个解析。

    首先来看一个表格:

     
      public protected private
    类中 可以被访问 可以被访问 可以被访问
    类外 可以被访问    
    子类 可以被访问 可以被访问  

    上面的表格已经可以让我们对这三个属性做一个清楚地认知,下面通过实例简述:

    1.public(公共的)

    class Person{
        public $name;
        public $age;
        public $sex;
    
        public function say()
        {
            echo "My name is ".$this->name.". I am ".$this->age." years old.".$this->sex." in sex.";
        }
    }
    
    $obj = new Person();
    $obj->name = "ZhangSan";
    $obj->age = "20";
    $obj->sex = "male";
    $obj->say();

    输出结果为:My name is ZhangSan. I am 20 years old.male in sex.

    //继承
    class Student extends Person{
    
        public function sing()
         {
             echo "My name is ".$this->name.". I am ".$this->age." years old.".$this->sex." in sex.";
         }
    }
    
    $obj1 = new Student();
    $obj1->name = "ZhangSan";
    $obj1->age = "20";
    $obj1->sex = "male";
    $obj1->sing();

    输出结果为:My name is ZhangSan. I am 20 years old.male in sex.

    可以看到,无论是在外部还是在继承中,public 属性都可以被访问到。还要注意一点,如果不加任何限定词,默认限定词即为public。

    2.protected(受保护的)

    我们把上个例子当中的方法设为受保护的,试一下在类外能否被访问到:

    class Person{
        public $name;
        public $age;
        public $sex;
    
        protected function say()
        {
            echo "My name is ".$this->name.". I am ".$this->age." years old.".$this->sex." in sex.";
        }
    }
    
    
    $obj = new Person();
    $obj->name = "ZhangSan";
    $obj->age = "20";
    $obj->sex = "male";
    $obj->say();

    输出结果是会报错:Fatal error: Call to protected method Person::say() from context '';提示我们在类外是不能访问受保护的方法的。 

    class Person{
    
        protected function say()
         {
    
             echo "我是父类";
         }
    }
    
    //子类继承父类
    class Student extends Person{
        function sing()
        {
            //调用父类受保护的方法
            echo $this->say();
        }
    }
    
    $obj = new Student();
    $obj->sing();

     输出结果为:我是父类。说明继承的子类可以调用父类中受保护的方法。

    3.private(私有的)

    看名字我们就大概可以看到,这个限制词把属性和方法限制成类私有的,所以在类外部和子类中都是不可访问的。

    class Preson{
    
        private function say(){
            echo "我是父类";
        }
    }
    
    $obj = new Preson();
    $obj->say();

     输出结果为报错:Fatal error: Call to private method Preson::say() from context '';

    在继承中怎么样呢?

    class Preson{
    
        private function say(){
            echo "我是父类";
        }
    }
    
    class Student extends Preson
     {
         function sing()
          {
              echo $this->say();
          }
     }
    
    $obj = new Student();
    $obj->sing();

     输出结果为报错:Fatal error: Call to private method Preson::say() from context '';

    子类覆盖父类的方法时也要注意一点,子类中方法的访问权限一定不能低于父类被覆盖方法的访问权限,也就是一定要高于或等于父类方法的访问权限。

  • 相关阅读:
    POJ 3041 Asteroids 最小点覆盖 == 二分图的最大匹配
    POJ 3083 Children of the Candy Corn bfs和dfs
    POJ 2049 Finding Nemo bfs 建图很难。。
    POJ 2513 Colored Sticks 字典树、并查集、欧拉通路
    POJ 1013 Counterfeit Dollar 集合上的位运算
    POJ 2965 The Pilots Brothers' refrigerator 位运算枚举
    无聊拿socket写的100以内的加法考试。。。
    POJ 1753 Flip Game
    初学socket,c语言写的简单局域网聊天
    汇编语言 复习 第十一章 标志寄存器
  • 原文地址:https://www.cnblogs.com/zhangxu-fasu/p/11232587.html
Copyright © 2011-2022 走看看