黑马程序员技术交流社区

标题: 【黑马程序员济南】PHP课程同步笔记:PHP类的三大特性(二) [打印本页]

作者: 小鲁哥哥    时间: 2017-8-8 15:10
标题: 【黑马程序员济南】PHP课程同步笔记:PHP类的三大特性(二)
本帖最后由 小鲁哥哥 于 2017-8-8 15:12 编辑

【黑马程序员济南】PHP课程同步笔记:PHP类的三大特性(二)
PHP类的三大特性:封装、继承、多态,今天我们来讲解一下剩下的一大特性,多态
多态
      多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:多态是指在面向对象中能够根据使用类的上下文来重新定义或改变类的性质和行为。   
      PHP不支持重载实现多态,但是PHP可以变向的实现多态效果
由多态我们引入一个概念:重写(覆盖)override
      将从父类继承下来的属性或方法重新定义,就叫做重写,也叫覆盖;
      重新定义的标识是:使用跟父类同名的属性名或方法名;
重写的基本要求
1,访问控制修饰符的范围不能更“小”:
      父类:public;        子类:public
      父类:protected;        子类:protected或public
      父类:private;        子类:不能覆盖!——即父类的私有成员,不存在被子类覆盖的问题;
2,对于方法的重写,还要求参数要跟父类一致。

让我们来看一下这个案例:
[PHP] 纯文本查看 复制代码
<?php
/*传智播客济南中心出品*/   
class A{
    public $p1 =1;
    protected $p2 =2;
    private $p3 = 3;
    function ShowInfo(){
        echo "父类中:p1 = ".$this->p1;
        echo "父类中:p2 = ".$this->p2;
        echo "父类中:p3 = ".$this->p3;
    }
}

class B extends A{
    public $p1 = 11;
    protected $p2 =22;
    private $p3 = 33;
    function ShowInfo(){
        echo "子类中:p1 = ".$this->p1;
        echo "子类中:p2 = ".$this->p2;
        echo "子类中:p3 = ".$this->p3;
        echo "<br />";
        parent::ShowInfo();
    }
}

$b1 = new B();
echo "<pre>";
var_dump($b1);
$b1->ShowInfo();

结果展示:

object(B)#1 (4){
     ["p1"] => int(11)
     ["p2":protected] => int(22)
     ["p3":"B":private] => int(33)
     ["p3":"A":private] => int(3)
}

子类中:p1 =11
子类中:p2 =22
子类中:p3 =33
父类中:p1 =11
父类中:p2 =22
父类中:p3 =3

从上面结果来看:
      p3的值有两个,一个是子类中的私有属性,另一个是父类中的私有属性
      两者虽然属性名一样但是因为限制修饰符为私有的,所以不能被覆盖。

讲到这里不知道你们对类的三大特性了解如何啊?哪里不会可以在评论中向我提问哟~


作者: Port    时间: 2017-8-8 15:28


作者: 小东姐姐    时间: 2017-8-10 16:59
感谢分享!{:8_488:}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2