• 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 '';

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

  • 相关阅读:
    php 对输入信息的过滤代码
    svn命令备忘
    php下载文件的代码示例
    html中meta的用法
    程序员技术练级攻略
    JavaScript输出对象的内部结构
    转载Web架构师成长之路
    php代码执行效率测试工具xhprof安装&使用
    [译]Pro ASP.NET MVC 3 Framework 3rd Edition (Chapter 20 JQuery) 5.Using jQuery Events 使用jQuery事件
    [译]Pro ASP.NET MVC 3 Framework 3rd Edition (Chapter 20 JQuery) 6.Using jQuery Visual Effects 使用jQuery特效
  • 原文地址:https://www.cnblogs.com/zhangxu-fasu/p/11232587.html
Copyright © 2020-2023  润新知