• PHP面向对象之继承


    继承

    • 介绍

      • 继承使得代码具有层次结构
      • 子类继承了父类的属性和方法,实现了代码的可重用性
      • 使用extends关键字实现继承
      • 父类和子类是相对的
    • 语法

    class 子类 extends 父类 {
    
    }
    
    • 执行过程
      • 第一步:在Student类中查找show(),如果找到就调用,找不到就到父类中查找
      • 第二步:在Person类中查询show()
    <?php
    class Person {
    	public function show() {
    		echo "嘿,人类!<br>";
    	}
    }
    class Student extends Person{
    
    } 
    $stu= new Student();
    $stu->show();
    ?>
    

    子类中调用父类成员

    • 方法
      • 通过实例化父类调用父类的成员
      • 通过$this关键字调用父类的成员
    <?php
    class Person {
    	public function show() {
    		echo "嘿,人类!<br>";
    	}
    }
    class Student extends Person{
      public function test1(){
        $person= new Person();
        $person->show();
      }
      public function test2(){
        $this->show();
      }
    } 
    
    $stu1= new Student();
    $stu1->test1();
    echo '<br>';
    $stu2= new Student();
    $stu2->test2();
    ?>
    

    protected

    • protected
      • 受保护的,在整个继承链上使用
    <?php
    class A {
      //在整个继承链上访问
    	protected $num= 10;	
    }
    class B extends A {	
    	public function getNum() {
    		echo $this->num;
    	}
    }
    //整个继承链上有A和B
    $obj= new B();    
    $obj->getNum();	
    ?>
    
    <?php
    class A {
      public function getNum() {
    		echo $this->num;
    	}
    }
    class B extends A {	
    	//在整个继承链上访问
    	protected $num= 10;	
    }
    //整个继承链上有A和B
    $obj= new B();    
    $obj->getNum();	
    ?>
    
    <?php
    class A {
      public function getNum() {
    		echo $this->num;
    	}
    }
    class B extends A {	
    	//在整个继承链上访问
    	protected $num= 10;	
    }
    //整个继承链上只有A
    $obj= new A();    
    $obj->getNum();	
    ?>
    

    继承中的构造函数

    • 规则

      • 如果子类有构造函数就调用子类的,如果子类没有就调用父类的构造函数
      • 子类的构造函数调用后,默认不再调用父类的构造函数
    • 语法

      • 通过类名调用父类的构造函数
      • parent关键字表示父类的名字,可以降低程序的耦合性
    # 通过类名调用父类的构造函数
    父类类名::__construct();
    
    # 通过parent关键字调用父类的构造函数
    parent::__construct();
    
    <?php
    class Person {
      //父类的构造函数
      public function __construct() {
        echo '这是父类<br>';
      }
    }
    class Student extends Person {
      //子类的构造函数
      public function __construct() {
        //通过父类的名字调用父类的构造函数
        Person::__construct();
        //parent表示父类的名字		
        parent::__construct();		
        echo '这是子类<br>';
      }
    }
    new Student();
    ?>
    
    • 案例
    <?php
    class Person {
    	protected $name;
    	protected $sex;
        //父类的构造函数
    	public function __construct($name, $sex) {
    		$this->name= $name;
    		$this->sex= $sex;
    	}
    }
    class Student extends Person {
    	private $score;
        //子类的构造函数
    	public function __construct($name, $sex, $score) {
    		parent::__construct($name, $sex);  //调用父类构造函数并传递参数
    		$this->score= $score;
    	}
        //显示信息
    	public function getInfo() {
    		echo "姓名:{$this->name}<br>";
    		echo "性别:{$this->sex}<br>";
    		echo "成绩:{$this->score}";
    	}
    }
    //测试
    $stu=new Student('sunny','男',28);
    $stu->getInfo();
    ?>
    

    $this详解

    • 概念
      • $this表示当前对象的引用,也就是$this保存的当前对象的地址
    <?php
    class A {
    	public function __construct(){
    		var_dump($this);
    	}
    }
    class B extends A {
    	
    }
    new A();
    echo '<br>';
    new B();
    ?>
    

    多重继承

    • 概念
      • PHP不允许多重继承,因为多重继承容易产生二义性
      • 如何实现C继承A和B,使用继承链
  • 相关阅读:
    springboot整合mybatis增删改查(一):项目创建
    springboot结合开源editor.md集成markdonw编辑器
    springboot发送邮件
    史上最全web.xml配置文件元素详解
    一套简约漂亮的响应式博客园主题皮肤分享给你们(二)
    一套简约漂亮的响应式博客园主题皮肤分享给你们(一)
    IDEA中项目统一编码格式设置
    windows上安装Gradle并配置环境变量
    linux自学(九)之开始centos学习,安装数据库MariaDB
    linux自学(七)之开始ccentos学习,安装jdk
  • 原文地址:https://www.cnblogs.com/SharkJiao/p/14117053.html
Copyright © 2020-2023  润新知