第2天 面向对象(二):静态属性/方法、三大特征

第 5 章 静态属性/静态方法

1.1 先看一个问题


image.png

l 我们先使用传统的方法解决-思路:
我们可以先定义一个全局变量$total_num; 当有一个小孩子加入游戏时,我们就把这个变量+1;
l 使用全局变量来搞定


image.png

image.png

说明:上面的代码解决问题,但是不是纯的OOP, 因为出现了全局变量,因此需要使用新的方案-->静态变量。

l 使用静态变量解决问题-代码


image.png

image.png

示意图:


image.png

5.2 静态属性基本介绍

概念:静态属性是该类的所有对象共享的变量,任何一个该类的对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量。这个从前面的图也可看出来.
5.3 如定义一个静态变量
访问修饰符 static $变量名;
说明一下,类的静态变量的定义,要放到类中。
5.4 如何访问静态变量


image.png

l 代码说明:


image.png

image.png

5.5 静态属性的注意事项
l $this和self的区别


image.png

l 其它注意事项


image.png

代码说明:
image.png

其它注意点:
image.png

l 静态属性的练习题


image.png

代码 :


image.png

image.png

image.png

5.6 静态方法

l 基本的介绍
基本语法是:
访问修饰符 static function 函数名{ 函数体;}
l 快速入门案例


image.png

l 关于静态方法的使用细节

(1) 什么时候,我们会使用到静态方法呢?
答: 在后面我们学习单例模式时,就是静态方法的经典使用案例.因为静态方法有一个特点,不需要创建对象实例就可以调用.


image.png

(2) 在类外部调用静态方法: 类名::静态方法名 或者 对象名->静态方法名 或者 对象名::静态方法(语法支持,但是不推荐)


image.png

(3) 在类内部调用静态方法: self::静态方法名 或者 类名::静态方法名 , 通过 $this也可以

image.png

image.png

(4) 注意:静态方法中不能访问非静态属性(普通属性, 没有static)。****普通的成员方法,可以访问静态属性****。
代码:

image.png

5.7 静态属性的小结


image.png

5.8 静态方法的小结


image.png

5.9 单例模式
l 看需求分析


image.png

l 代码实现11
第一种写法:


image.png

image.png

image.png

第二种写法:


image.png

l 练习题


image.png

评讲:


image.png

image.png

image.png

image.png

第 6 章 面向对象编程的三大特征
1.1 抽象这个概念
抽象:是一种研究分析问题方法,就是把一类事物的共有的属性和行为(方法)提取出来,形成一个类。这种思想就是抽象的思想。
举例说明:

image.png

代码:
image.png

image.png

image.png

6.2 封装
l 基本概念
image.png

l 如何实现封装


l 举例说明这三个访问修饰符:

image.png

image.png

image.png

l 看一个关于封装的案例


image.png

image.png

6.3 访问protected , private属性的三种方式

l 第一种方式


image.png

代码说明:


image.png

image.png

image.png

说明: 使用__get 和 __set 方法来操作 属性
(1) 优点:简单,较为统一.
(2) 缺点:不够灵活.
l 第二种操作protected 和 private 的属性的方式
代码说明:


image.png

image.png

l 第三种方式-直接写一个public函数,来操作protected 和 private 属性


image.png

image.png

关于选择哪种方式的说明

(1) 主要是根据需求来决定的.
(2) setXxx 和 getXxx 方式针对单个的属性分别操作的.
(3) 第三种方式可以通过一个public的函数来操作多个属性,这样比较通用.
(4) 使用的概率大还是第二种和第三种. 第一种使用比较少.

l 访问修饰符的使用的注意


image.png

代码说明:


image.png

image.png

l 封装的练习题


image.png

6.4 对象运算符的连用现象


image.png

案例:


image.png

需求是,通过学生找到该学生对于的班级信息.


image.png

image.png

image.png

image.png

image.png

对应的练习题:


image.png

image.png

image.png

image.png

image.png

image.png

6.5 继承

6.5.1 为什么需要继承

先看一个问题:


image.png

image.png

image.png

l 分析上面的问题和解决思路


image.png

l 使用继承后的代码如下

<?php
 header('content-type:text/html;charset=utf-8');



 //继承的必要性
 //父类,基类
 class Student{
   
   public $name;
   public $age;
   protected $fen;
   public function setFen($fen){
     $this->fen = $fen;
   }
   public function showInfo(){
     echo '<br>学生的名字是 ' . $this->name . ' 学生的年龄是 '  . $this->age . ' 学生成绩是 '  . $this->fen;
   }
 }

 //子类,扩展类
 class Pupil extends Student{
   
   public function testing(){
     echo '<br>小学生在考试...';
   }

 }

 //使用一下
 $pupil1 = new Pupil();
 $pupil1->name = '小马';
 $pupil1->age = 10;
 $pupil1->testing();
 $pupil1->setFen(80);
 $pupil1->showInfo();

 //定义类, 大学生
 //子类,扩展类
 class Graduate extends Student{
   
   public function testing(){
     echo '<br>大学生在考试...';
   }

 }

 //使用一下
 $graduate1 = new Graduate();
 $graduate1->name = '老马';
 $graduate1->age = 30;
 $graduate1->testing();
 $graduate1->setFen(90);
  $graduate1->showInfo();

6.5.2 继承的介绍


image.png

6.5.3 继承的细节说明
l 父类的public修饰符的属性和方法,protected修饰符的属性和方法被子类继承了并可以访问
代码说明:


image.png

image.png

image.png

l 继承的本质

继承发生了什么?
说明
继承不能简单的理解成子类定义时,会把父类的属性声明,方法定义拷贝一份,而是建立了继承查找的的关系.
举例说明:

image.png

image.png

示意图:
image.png

l 子类最多只能继承一个父类(指直接继承)
即: php的OOP编程是单继承机制.

image.png

l 子类可以继承其父类(或者基类)的 public ,protected修饰的变量(属性) 和 函数(方法)
l 在创建某个子类对象时,默认情况下会自动调用其父类的构造函数(指在子类没有自定义构造函数情况时), 如果子类自己有构造函数,则调用自己构造函数.
案例说明:
image.png

l 如果在子类中需要访问其父类的方法(构造方法/成员方法 而且方法的访问修饰符是public/protected),可以使用父类::方法名(或者 parent::方法名 ) 来完成
image.png

image.png

l 如果子类(扩展类)中的方法和父类(基类)方法相同,我们称为方法重写
l 类定义的进一步完善


image.png

l 作业练习题


image.png
<?php
  header('content-type:text/html;charset=utf-8');
  /*
  练习题:
  请设计一个父类 
  Student(名字【公有】,年龄【公有】班级【保护】,专业 【保护】, 考分 [私有],   还有一个 showName方法)

  Pupil 继承 Student , 并增加一个属性
  考分[私有], 手机号[保护], 学校名【公有】
  创建一个 Puipl 对象,画出对应的继承关系图

  */

  class Student{
    public $name;
    public $age;
    protected $my_class;
    protected $major;
    private $grade;

    public function showName(){
      echo 'name=' . $this->name;
    }
  }

  class Pupil extends Student{
    
    private $grade;
    protected $tel_phone;
    public $school_name;

    //构造函数
    public function __construct($grade, $tel_phone, $school_name, $name, $age, $my_class, $major){
      $this->grade = $grade;
      $this->tel_phone= $tel_phone;
      $this->school_name = $school_name;
      //怎样给自己继承的父类的属性赋值?
      //1. 直接在子类中对继承的属性赋值
      $this->name = $name;
      $this->age = $age;
      $this->my_class = $my_class;
      $this->major = $major;

    }

  }

  $pupil = new Pupil(70, 123456789, '北京小学', '小白', 10, '小学1年级', '美术专业');

  echo '<pre>';
  var_dump($pupil);
  $pupil->showName();

第二种思路:

<?php
  header('content-type:text/html;charset=utf-8');
  //

  class Student{
    public $name;
    public $age;
    protected $my_class;
    protected $major;
    private $grade;

    public function showName(){
      echo 'name=' . $this->name;
    }

    //构造函数
    public function __construct($name, $age, $my_class, $major){
      $this->name = $name;
      $this->age = $age;
      $this->my_class = $my_class;
      $this->major = $major;
    }
  }

  class Pupil extends Student{
    
    private $grade;
    protected $tel_phone;
    public $school_name;

    //构造函数
    public function __construct($grade, $tel_phone, $school_name, $name, $age, $my_class, $major){

      $this->grade = $grade;
      $this->tel_phone= $tel_phone;
      $this->school_name = $school_name;
      //怎样给自己继承的父类的属性赋值?
      
      parent::__construct($name, $age, $my_class, $major);

    }

  }

  //$student = new Student('犀牛精', 400, '大神一期', '腾云');
  $pupil = new Pupil(56, 3456789000, '火云洞', '犀牛精', 400, '大神一期', '腾云');

  echo '<Pre>';
  var_dump($pupil);

6.5.4 方法重载

l 传统****的意义上的方法重载指一个标识符被用作多个方法名,且能够通过方法的参数个数或参数类型将这些同名的函数区分开来,调用不发生混淆。调用的时候,虽然方法名字相同,但根据参数不同可以自动调用对应的函数。
代码说明一下:

image.png

l php中如何实现重载

image.png

代码实现:
image.png

image.png

l __callStatic 的使用

(1) 基本使用案例


image.png

(2) 使用__callStatic 实现静态方法的重载


image.png

image.png

l 练习题:
image.png

image.png

6.5.5 属性的重载

概述: 可以通过__set 和 __get来实现属性重载
代码说明:

image.png

image.png

如果你不希望程序员使用到属性重载的现象.


image.png

6.5.6 方法的重写

l 问题的引出

既然子类可以继承父类的属性和方法,这样可以提高代码的复用性,这个很好,问题来了,假设现在我要求大家写三个类 猫猫,狗狗,猪猪.我们知道这三个东东都是动物,动物必然存在相同的特点。根据类的抽象特征,我们可以把它们的相同点提取出来,形成一个父类 Animal,然后继承

l 一个子类中有一个方法,和父类的某个方法是完全一样的,那么我们就称为,子类的方法重写了父类的方法。

l 方法重写的基本用法

image.png

image.png

image.png

l 方法重写概念再说明
image.png

l 方法重写的细节
(1) parent::静态属性 [这种方式不能访问普通属性,但是能访问父类的静态属性,而且这个静态属性的访问控制符必须是public 或者 protected]


image.png

(2) 如果子类要重写父类的某个方法,则要求子类的方法名和参数个数要和父类的那个方法完全一样
代码:3


image.png

上面的写法,因为子类的cry 和 父类的 cry 的参数个数不一样,因此报错.
l 对方法重写的细节总结


image.png

对应的代码:
image.png

6.5.7 属性重写

基本概念:** 注意点**:

1. public 和 protected可以被重写。

2. private 的属性不能被重写

代码说明:


image.png

l 重写的练习题


image.png

6.6 多态

l 基本介绍:


image.png

代码说明:

image.png

image.png

image.png

image.png

image.png

image.png

l 练习题,请大家看PPT

6.7 类型约束补讲(重点!)


image.png

接口也可以用于类型约束

l 类型约束不能用于标量类型如 [int]或 [string]。[Traits] 也不允许

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,958评论 6 13
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,097评论 1 32
  • 1 面向对象No6 面向对象 OO Object Oriented 编程时以对象为单元,封装数据和逻辑,以此提...
    征程_Journey阅读 1,141评论 0 2
  • 一、封装 将类的某些信息隐藏在类内部,不允许外部程序直接访问(隐藏对象的信息)通过该类提供的方法来实现对隐藏信息的...
    Scalelength阅读 546评论 0 1
  • 今天,一见倾心微电影剪辑工作完成了。成品很让人失望,微电影不是微电影、情景剧不是情景剧。这么多年,一直想要...
    百龄语阅读 176评论 0 0