• php--有限继承


    思考:类中有三大类成员:属性,方法和类常量,还有访问修饰限定符限制,那么继承是子类可以使用父类所有成员吗?

    引入:从理论上讲,继承后子类是可以访问父类的所有成员的,但实际上父类有一些成员并不希望被子列访问的,所以继承是有限的

    有限继承【掌握】

    定义 :有限继承,指子类在继承父类的成员的时候,并非继承所有内容,而是继承并使用父类的部分内容

      1.继承内容:php中继承是子类继承父类所有的公有成员,受保护成员和私有属性,不能继承父类的私有方法

    <?php
    class posen{
        protected $age=30;
        public $sex="女";
        private $count=100;
    
        public function show(){
            echo $this->count;
        }
    
        private function inbox(){
            echo '我是不能被继承的';
        }
    }
    
    class man extends posen{
        public function add(){
            echo $this->age;    //其中age 也是继承了posen的属性
        }
    }
    
    
    $s=new man();
    $s->show();   //输出100
    $s->add();   //输出30
    $s->inbox();   //语法直接就报错了
    ?>

    注意:虽然子类可以通过以上方式来实现访问父类的私有成员(包含私有方法),但是从设计的意义上讲,私有就是不允许外部访问,所以父类通常不会提供对外访问接口,以上案例只是

    为了知识说明。

      4.静态成员(类常量)也遵循继承规则(php继承本质是对象),只是访问方式由类进行访问

    <?php
    class posen{
        protected static $age=30;
        public static $sex="女";
        private static $count=100;
    
        public static function show(){
            echo self::$count;
        }
    
        private static function inbox(){
            echo '我是不能被继承的';
        }
    }
    
    class man extends posen{
    
    }
    echo man::$sex;   //用man继承了posen下的静态属性,调用也是用man
    man::show();
    
    
    ?>

    5.构造方法和析构方法也可以被子类继承,此时需要注意子类对象实例化时,对应的父类构造方法的参数

    <?php
    class posen{
     private $count;
     public function __construct($s){
         $this->count=$s; 
     }
     public function __destruct(){
        echo 'die';
     }
    }
    
    class man extends posen{
    
    }
    
    //$s=new man();   //子类实例化,自身是空类,没有指定构造函数 报错
    //因为继承父类的构造函数是有参数的,所以以上方法是错误的
    
    $s=new man(100);  //正确的调用
    
    
    ?>

    总结:  

      继承是有限继承,理论上是用来继承父类允许被继承的部分,即使用public或者protected修饰的成员

      因为对象的属性是保存在对象内存空间,所以父类的私有属性也会被继承

      父类私有成员本质不允许被子类访问,但是可以通过父类开放接口实现(一般不会这么做)

      静态成员也可以遵循继承规则

      构造方法也可以被继承,因此在实例化子类对象的时候,要考虑到父类构造方法所使用到的参数问题

  • 相关阅读:
    解决Django在mariadb创建的表插入中文乱码的问题
    运行在CentOS7.5上的Django项目时间不正确问题
    获取百度网盘真实下载连接
    Django2.x版本在生成数据库表初始化文件报错
    Pycharm中的Django项目连接mysql数据库
    Django2.x版本路由系统的正则写法以及视图函数的返回问题
    CentOS7.5安装坚果云
    CentOS7.5安装下载工具
    CentOS6.5修改/etc/pam.d/sshd后root无法ssh登陆
    oracle 时间
  • 原文地址:https://www.cnblogs.com/xiaowie/p/12287875.html
Copyright © 2020-2023  润新知