美文网首页
PHP类的封装性、继承性和多态性

PHP类的封装性、继承性和多态性

作者: 老衲灬 | 来源:发表于2018-07-07 19:24 被阅读39次

    一、类的封装性

    1、什么是类的封装性

    1)类的三大特性:封装性、继承性、多态性;
    2)封装性:将敏感的数据保护起来,不被外界访问;还可以理解为,将一个功能的方方面面,封装成一个整体,即类;
    3)类的封装性,是通过访问权限修饰符来实现的;
    4)在项目中,属性基本都是私有的。通过公有的方法,对私有的属性进行赋值和取值。

    2、访问权限修饰符介绍

    1)public(公共的权限):在任何地方都可以被访问,主要是类内、类外、子类中都可以被访问。
    2)private(私有的权限):只能在本类中被访问,类外和子类中无权访问。
    3)protected(受保护的权限):只能在本类中和子类中被访问,在类外不能访问。

    3、实例:封装一个简单的数据库工具类
    //定义一个数据库工具类
    class Db
    {
        //私有的数据库配置属性
        private $db_host;//主机名
        private $db_user;//用户名
        private $db_pass;//密码
        private $db_name;//数据库名
        private $charset;//字符集
        private $link = null;//连接资源
    
        //公共的构造方法:数据库对象初始化
        public function __construct($config = array())
        {
            $this->db_host = $config['db_host'];
            $this->db_user = $config['db_user'];
            $this->db_pass = $config['db_pass'];
            $this->db_name = $config['db_name'];
            $this->charset = $config['charset'];
            //一个小功能定义一个方法,两个方法的功能不能相同
            //一个方法只做一件事
            $this->connectDb();//连接数据库
            $this->selectDb();//选择数据库
            $this->setCharset();//设置字符集
        }
        
        //私有的连接mysql服务器的方法
        private function connectDb()
        {
            if(!$this->link = @mysqli_connect($this->db_host,$this->db_user,$this->db_pass))
            {
                echo "连接服务器失败!";
                die();
            }
        }
        //私有的选择当前数据库
        private function selectDb()
        {
            if(!mysqli_select_db($this->link,$this->db_name))
            {
                echo "连接数据库失败!";
                die();
            }
        }
        //私有的设置字符集
        private function setCharset()
        {
            mysqli_set_charset($this->link,$this->charset);
        }
    }
    //创建数据库对象
    $arr=[
        'db_host' => 'localhost',
        'db_user' => 'root',
        'db_pass' => '666666',
        'db_name' => 'hsz',
        'charset' => 'utf8'
    ];
    $db = new Db($arr);
    var_dump($db);
    

    二、类的继承性

    1、什么是类的继承性?

    1)如果一个B类拥有了A类的所有特征信息,我们就说B类继承了A类。
    2)A类可以称为:基础类(最顶层的类)、父类、上层类。
    3)B类可以称为:最终类(最终的类)、子类、下层类。
    4)提示:如果多个子类拥有相同的属性和方法,可以将相同的属性和方法提取出来,放到“父类”中,然后,再创建子类并继承父类;这样一样,重复的代码只写一遍,减少代码量,提高工作效率。
    5)为什么要使用类的继承?是为了实现功能的升级和扩展。
    6)功能的升级:原来有的功能,在子类进行完善。
    7)功能的扩展:原来没有的功能,在子类增加新功能。

    2、继承的语法格式
    3、单继承和多继承

    1)单继承:只能从一个父类来继承功能。如:Java、PHP、C#等。

    2)多继承:同时从多个父类来继承功能。如:C++ 图片.png
    4、实例:单继承的简单演示
    //定义一个学生类
    class Student
    {
        const TITLE = "<h2>学生信息</h2>";
        public static $count = 100;
        public $name = "和尚周";
        public function showInfo()
        {
            return __METHOD__;
        }
        public static function readMe()
        {
            return __METHOD__;
        }
    }
    //定义清华学生类,并继承学生类
    class QinghuaStudent extends Student
    {
        public function printInfo()
        {
            $str = self::TITLE;
            $str .= "学生人数:".self::$count;
            $str .= "<br>姓名:".$this->name;
            $str .= "<br>调用成员方法:".$this->showInfo();
            $str .= "<br>调用静态方法:".self::readMe();
            echo $str;
        }
    } 
    //创建清华学生类对象
    $stu = new QinghuaStudent();
    $stu->printInfo();
    
    结果如下: 图片.png
    5、parent关键字

    1)self代表当前类,parent代表父类。
    2)self和parent可以存在于所有方法(成员方法和静态方法)中。
    3)self用来调用本类的内容,包括:类常量、静态属性、静态方法、成员方法;
    4)parent用来调用父类的内容,包括:类常量、静态属性、静态方法、成员方法;
    5)self和parent都使用范围解析符"::"来调用其它内容。也可以叫静态化调用方式。

    6)语法:parent::类常量 | 静态属性 | 静态方法 | 成员方法 图片.png

    三、类的多态

    1、什么是类的多态?

    1)类的多态,就是类的多种形态。
    2)类的多态主要指方法重载或方法重写。
    3)方法重载:在同一个类中定义两个同名方法,PHP不支持。
    4)方法重写:在子类中定义一个与父类同名的方法,就是“方法重写”。
    5)为什么要重写方法?主要是实现功能的升级。父类中有的方法,子类中再用同样的名字再定义一次,一般来说,子类中方法的功能比父类更完善、更详尽。

    2、方法重写的要求

    1)子类中重写的方法,要与父类中的方法同名;
    2)子类中重写的方法形参个数,要与父类中的同名方法形参个数一致;
    3)子类中重写的方法类型,要与父类中同名方法类型一致,要是静态方法都是静态方法,要是成员方法都是成员方法。
    4)子类中重写的方法的访问权限,不能低于父类中同名方法的访问权限;
    a、父类方法权限为public,子类同名方法权限只能是public;
    b、父类方法权限为protected,子类同名方法权限可以是protected和public;
    c、父类方法权限为private,子类无法继承,也无法重写。
    5)注意:对于重写构造方法,就比较特殊,就没有形参个数的要求。
    示例:

    //定义一个学生类
    class Student
    {
        //静态方法
        public static function readMe($name,$age)
        {
            echo "{$name}的年龄是{$age}岁";
        }
    }
    //定义清华学生类,并继承学生类
    class QinghuaStudent extends Student
    {
        public static function readMe($v1,$v2)
        {
            echo "{$v1}=>{$v2}";
        }
    } 
    //调用QinghuaStudent的静态方法
    QinghuaStudent::readMe('heshangzhou',100);
    

    结果:heshangzhou=>100

    3、实例:商品子类重写商品基础类中的方法
    //定义基础商品类
    class Shop
    {
        //私有的商品属性
        private $name;
        private $price;
        //受保护的构造方法
        protected function __construct($name,$price)
        {
            $this->name = $name;
            $this->price = $price;
        }
        //受保护的显示商品信息
        protected function showInfo()
        {
            $str = "商品名称:{$this->name}";
            $str .= "<br>商品价格:{$this->price}";
            return $str;
        }
    }
    //定义手机商品类
    class Mobile extends Shop
    {   
        //私有的手机属性
        private $pinpai;
        private $city;
        //重写构造方法
        public function __construct($name,$price,$pinpai,$city)
        {
            parent::__construct($name,$price);
            $this->pinpai = $pinpai;
            $this->city = $city;
        }
        //重写父类的showInfo方法
        public function showInfo()
        {
            $str = parent::showInfo();
            $str .= '<br>手机品牌:'.$this->pinpai;
            $str .= '<br>手机产地:'.$this->city;
            echo $str;
        }
    }
    //定义图书类
    class Book extends Shop
    {   
        //私有的图书属性
        private $author;
        private $publish;
        //重写构造方法
        public function __construct($name,$price,$author,$publish)
        {
            parent::__construct($name,$price);
            $this->author = '<br>图书作者:'.$author;
            $this->publish = '<br>出版社:'.$publish;
        }
        //重写父类的showInfo方法
        public function showInfo()
        {
            $str = parent::showInfo();
            $str .= $this->author;
            $str .= $this->publish;
            echo $str;
        }
    }
    //创建手机类
    $pro = new Mobile('iphone8',8888,'苹果','美国');
    $pro->showInfo();
    echo "<hr>";
    //创建图书类
    $book = new Book('《你知道张三吗》',199,'李四','中国');
    $book->showInfo();
    
    结果如下: 图片.png

    四、最终类和最终方法

    概述:

    1)Final关键字修饰的类,就是最终类;
    2)Final关键字修饰的方法,就是最终方法;
    3)最终类:该类只能实例化,不能被继承。该类十分完善了,不需要升级和扩展。
    4)最终方法:该方法可以被继承,但不能重写。该方法十分完善了,不需要重写了。

    五、抽象类和抽象方法

    1、概述

    1)abstract关键字修饰的类,就是抽象类;
    2)abstract关键字修饰的方法,就是抽象方法;
    3)抽象类:该类不能直接实例化,必须先继承后再实例化。常用在基础类。
    4)抽象方法:方法必须先继承后重写。
    5)抽象方法就是方法的命名规范、命名规则,也可以理解为一种监督机制。
    6)所有的抽象方法都必须重写,少一个都不行。
    7)抽象方法没有方法体,必须在子类重写后,再定义方法体。
    8)如果一类中有一个抽象方法,该类必须是抽象类。
    9)抽象方法权限不能是private,因为要先继承再重写。
    10)在PHP7中,抽象方法可以是成员方法,也可以是静态方法。
    11)抽象类中,可以包含其它成员:常量、成员属性、成员方法、静态属性、静态方法。
    示例:

    //定义抽象类
    abstract class Shop
    {
        //定义抽象方法:方法的目录大纲、监督机制
        abstract public static function showInfo($name,$price);
        abstract public function readMe();
    }
    //定义最终的图书类
    final class Book extends Shop
    {   
        //重写showInfo方法
        public static function showInfo($name,$price)
        {
            echo __METHOD__."<br>";
        }
        //重写readMe方法
        public function readMe()
        {
            echo __METHOD__;
        }
    }
    //创建图书类对象
    $obj = new Book();
    //PHP7中也可以通过对象调用静态方法
    $obj->showInfo('moumou',20);
    $obj->readMe();
    
    结果如下: 图片.png

    相关文章

      网友评论

          本文标题:PHP类的封装性、继承性和多态性

          本文链接:https://www.haomeiwen.com/subject/qdmguftx.html