Day23 类别与物件--继承、常见关键字

物件导向的继承(inheritance)特性

继承 为物件导向程序设计的特性之一,子类别 (subclass) 可以承接父类别 (superclass) 的 public 或 protected 成员 ,这两者间就具有共通的 public 或 protected 成员。

  • 继承的格式:
  clas 类名 extends 父类名{
      - 书写子类独有的方法和书写
  }
  • 概念:
    父类: 被其它类继承的就是父类,也叫作基类
    子类: 继承其他类的类就是子类
  • 特点:
    1. 子类继承父类既具备父类中所有的成员属性和方法(私有的除外)
    2. 子类继承父类之後可以具有子类独有的属性和方法
    3. 在继承时,子类中允许出现和父类同名的方法,这种情况不会冲突,而是子类的方法会覆盖父类的方法,这种方式叫做重载(从新加载)
    4. 魔术方法也可以被子类继承
    5. 如果父类具有构造方法,子类也需要构造方法进行构造成员属性,此时需要在子类中重载父类的构造方法,并且在构造方法中使用parent::__construct()进行调用父类的构造方法,构造继承而来的父类的成员属性
      PS. 继承代码的时候不要瞎继承,要有一定的逻辑关系,人类不要继承鸟类,不会变成鸟人
  • php继承的特点和其他语言略有不同
    • php是单继承的语言
    • 其他语言可能是多继承
      PS. 可以研究一下trait可以实现多继承
<?php
//如果类前加上final关键字 则 该类不能被继承。此代码运行会报错,
//报错有两点:1. Animal类被Bear 类继承。 2. Bear类中重载Animal类的方法。这两个都被final修饰,所以不能重载也不能继承。
final class Animal
{
    //成员属性
    public $name = 'Animal in the World';
    public $sex;
    //成员方法
    final function life()
    {
        echo 'We are family~';
    }
    function sing()
    {
        echo 'Voice of Everything';
    }
}

//骡子类
class Bear extends Animal
{
    //成员属性

    //成员方法
    function life() //失败:Method 'Bear::life()' cannot override final method 'Animal::life()'
    {
        echo '熊熊熊熊';
    }
}

//实例化对象
$one = new Bear;
var_dump($one);
$one->sing();
$one->life();

属性和方法的可视性(The Visibility of Properties and Methods)

访问类型控制,定义类的属性public(public是修饰符,共有三个,是public,protected,private)
如果没有加上关键字,则PHP预设就当他是public的,属性则必须要加上修饰符不然会报错(如果用var关键字宣告的属性则预设会当做public)。

  • 三个封装关键字
    • private 私有化封装
    • public 公共的封装
    • protected 受保护的封装
    • 子类同名的方法的封装登记必须大於或者等於父类的封装等级
    • private = 1
    • protected = 2
    • public = 3
    • var是封装关键字,但是它不是一个标准的封装关键字,var只能修饰成员属性了,不能修饰成员方法,一般仅用於测试和学习。
    • var = 50%public

常见的关键字

  • final 关键字:之前例子有

    • 作用:
      1. 用来修饰成员方法,禁止在子类中重载父类的方法。
      2. 用来修饰类,被final修饰的类无法被继承。
  • const 关键字

    • 使用CONST关键字在类中声明常量,这种常量是类中的常量。 、
    • 声明常量时需要给常量赋值
    • 声明常量归类所有而不是归物件所有
    • 类中常量的访问方式
      • 类外部
        • 类名::常量名
      • 类内部
        • 类名::常量名
        • self::常量名
    • 需要记住的是:
      • self 表示当前类
      • $this 当前的物件
  • static 关键字

    • 在类中使用static声明的成员都是静态成员
    • 静态成员的特徵是:不归物件所有,而是归类所有
    1. static关键字,可以修饰成员属性、成员方法
    2. static声明的成员都是归类所有,而不是归物件所有,在没有物件的情况下,可以通过类来访问
    3. 能声明静态的成员就声明静态的成员(效率高)
    4. 具有动态成员的方法不可以声明静态成员方法。
    • 静态成员访问
      类的内部
      类名::$静态成员属性名
      self::$静态成员属性名
      类名::静态成员方法名();
      self::静态成员方法名();

      类的外部
      类名::$静态成员属性名
      类名:静态成员方法名()

      物件->静态成员方法名()(一般不用)
      
  1. 魔术方法 __toString()

    • 触发时机:对一个物件进行echo操作时自动触发
    • 功能:简化操作或者为物件输出值
    • 参数:无
    • 返回值: 必须有,并且必须为字符串类型
  2. 魔术方法 __call()

    • 触发时机:调用类中不存在的方法时自动触发
    • 功能:1.屏蔽错误 2为不存在的方法定义一个功能
    • 参数:2个; 1个是不存在的方法名,一个是所有的参数列表
    • 返回值: 可有可无

<<:  Day25:看看猪走路

>>:  Day 28 JavaScript < 简单介绍>

[DAY 18] 阿豪牛车庒冰糖猪脚

阿豪牛车庒冰糖猪脚 地点:台南市新营区公园路一段218号 时间:17:00~21:00 在南部有些店...

[Day29]- 新手的Web系列JSON Injection 0x2

Day29- 新手的Web系列JSON Injection 0x2 正文 web2.0导入了很多Aj...

30天学习笔记 -day 30 -感言

LAST Day 终於到了铁人赛的最後一天,过程中复习了不少的东西,对某些用法有了更加的认识,过程中...

五套最佳SoundCloud下载器--〖2022〗

SoundCloud 是一家位於德国柏林的在线音频分发平台。 对於那些喜欢好音乐并想找到更多背景音乐...

javascript变数与运算子4

在结束这个运算子系列之前,我们来制作一个可以跟使用者互动的简易网页乘法器。 以下是执行画面 ...