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

一、类的封装性

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
图片.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
图片.png
5、parent关键字

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

6)语法:parent::类常量 | 静态属性 | 静态方法 | 成员方法
图片.png
图片.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
图片.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

猜你喜欢

转载自blog.csdn.net/csdn_heshangzhou/article/details/80954032