一、类的封装性
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#等。
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都使用范围解析符"::"来调用其它内容。也可以叫静态化调用方式。
三、类的多态
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
网友评论