前言
下面所讲的知识点都是个人从书中和各种教学视频里总结出来的一些小知识,可能总结的不是很到位,如果有总结的不对的地方,还希望各位简友指点...希望这篇文章能够对初学者有所帮助
本篇文章的学习目标:
- 类的封装性
- 类的继承性
- 类的多态性
- 最终类和最终方法
- 抽象类和抽象方法
类的封装性
1:什么是类的封装性?
封装性:将敏感的数据保护起来,不被外界访问;还可以理解为,讲一个功能的方方面面,封装成一个整体,即类;类的封装性是通过访问权限修饰符来实现的。在项目中,属性基本都是私有的(private)。通过公有的方法,对私有的属性进行赋值和取值。
2:什么是访问权限修饰符?
public(公共的权限):在任何地方都可以被访问,主要是类内、类外、子类中都可以被访问。
private(私有的权限):只能在本类中访问,类外和子类中无权访问。
protected(受保护的权限):只能在本类中和子类中被访问,在类外不能访问。
举个小例子
//封装一个简单的数据库工具类(数据库初始化部分)
class Db{
//私有的数据库配置属性
//在项目中,属性一般都是私有的,通过公共的方法赋值
//属性一般情况下,没有默认值
private $db_host;//数据库主机名
private $db_prot;//数据库端口号
private $db_user;//数据库用户名
private $db_pass;//数据库密码
private $db_name;//数据库名称
private $charset;//字符集设置
//公共的构造方法:数据库对象初始化
public function __construct($config = array ())
{
$this->db_host = $config['db_host'];
$this->db_port = $config['db_port'];
$this->db_user = $config['db_user'];
$this->db_pass = $config['db_pass'];
$this->db_name = $config['db_name'];
$this->charset = $config['charset'];
//一个方法定义一个功能,各个方法的功能不能交叉,一个方法只能干一件事。
$this->connectDb();//连接MySQL服务器
$this->selectDb();//选择数据库
$this->setcharset();//设置字符集
}
//私有的连接MySQL服务器的方法:localhost::3306,root,123;
private function connectDb()
{
if(!@mysql_connect($this->db_host.":".$this->db_port,$this->user,$this->pass))
die("PHP连接MySQL服务器失败!");
}
//私有的选择数据库的方法
private function selectDb()
{
if(!mysql_select_db($this->db_name))
die("选择数据库{$this->db_name}失败!");
}
//私有属性设置字符集的方法
private function setCharset()
{
mysql_query("set names{$this->charset}");
}
}
//创建数据库类的对象
$arr = array(
'db_host' => ' localhost',
'db_port' => '3306',
'db_user' => 'root',
'db_pass' => '123',
'db_name' => 'mysql',
'charset' => 'utf8'
);
$db = new Db($arr);
var_dump($db);
类的继承性
1:什么是类的继承性?
就像CSS样式继承一样,父标签定义的样式,可以在子标签中直接使用。相同的样式只写一遍,减少代码量。
如果一个B类拥有A类所有的特征信息,我们可以说B类继承了A类。
A类可以称为:基础类(最顶层的类)、父类、上层类。
B类可以称为:最终类(最终的类)、子类、下层类。
如果多个子类拥有相同的属性和方法,可以将相同的属性和方法提取出来,放到“父类”中,然后,在创建子类并继承父类,这样一来,重复的代码只写一遍,减少代码量,提高工作效率。
2:类的继承可以做什么?
可以实现功能升级和功能扩展
功能的升级:原来有的功能,在子类进行完善。
功能的扩展:原来没有的功能,在子类增加新功能。
3:继承的语法格式
//继承的语法格式
class B extends A{
//子类的定义代码
}
B代表新创建的子类的名称;
A代表已经存在的父类的名称;
extends 是继承的关键字;
4:单继承和多继承
单继承:只能从一个父类来继承功能。例如:PHP、JAVA、C#等。
多继承:同时从多个父类来继承功能。例如:C++
继承:将父类所有内容全部拿过来,一个不剩.继承可以减少代码量,节省成本,继承相当于"引用传递至".
示意图.png
5:parent 关键字
self 代表当前类,parent代表父类
self 和parent 可以存在于所有方法(成员方法和静态方法)中.
self 用来调用本类的内容,包括:类常量、静态属性、静态方法、成员方法;
self和parent都使用范围解析符"::"来调用其它内容。
语法:parent::类常量|静态属性|静态方法|成员方法...
类的多态
1:什么是类的多态
类的多态就是类的多种形态
类的多态主要指方法重载或方法重写.
方法重载:在同一个类中定义两个同名方法,PHP不支持。
方法重写:在子类中定义一个与父类同名的方法,就是“方法重写”。
为什么要重写方法?主要是实现功能的升级。父类中有的方法,子类中再用同样的名字再定义一次。一般来说,子类中方法的功能比父类更完善、更详尽。
2:方法重写的要求
- 子类中重写的方法,要与父类中的方法同名;
- 子类中重写的方法形参个数,要与父类中的同名方法形参个数一致;
- 子类中重写的方法类型,要与父类中同名方法类型一致;
- 子类中重写的方法的访问权限,不能低于父类中同名方法的访问权限。
父类方法权限为public,子类同名方法权限只能是public;
父类方法权限为protected,子类同名方法权限可以是protected和public;
父类方法权限为private,子类无法继承,也无法重写。
注意:对于重写构造方法,就比较特殊,就没有形参个数的要求。
举个例子:
//定义一个学生类
class student
{
//受保护的自我显示的静态方法
protected static function showInfo($a,$b)
{
return"{$a}的年龄是{$b}岁!<br>";
}
}
//定义另一个学生类,并继承学生类
class fun_student extends student
{
//重写父类的showInfo()方法
public static function showInfo($name,$age);
{
$str = parent::showInfo($name,$age);
$str .=__METHOD__;
echo $str;
}
}
//创建另一个类的对象
$obj = new fun_student;
$obj->showInfo('小明',18);
最终类和最终方法
1:概述
- Final关键字修饰的类,就是最终类;
- Final关键字修饰的方法,就是最终方法;
- 最终类:该类只能实例化,不能被继承。该类十分完善了,不需要升级和扩展。
- 最终方法:该方法可以被继承,但不能重写。该方法十分完善了,不需要重写了。
抽象类和抽象方法
概述:
abstract关键字修饰的类,就是抽象类;
abstract关键字修饰的方法,就是抽象方法;
抽象类:该类不能直接实例化,必须先继承后再实例化。常用在基础类。
抽象方法:方法必须先继承后重写。
抽象方法就是方法的命名规范、命名规则,也可以理解为一种监督机制。
所有的抽象方法都必须重写,少一个都不行。
抽象方法没有方法体,必须在子类重写后,再定义方法体。
如果一类中有一个抽象方法,该类必须是抽象类。
抽象方法权限不能是private,因为要先继承再重写。
抽象方法只能是成员方法,而不能是静态方法。
抽象类中,可以包含其它成员:常量、成员属性、成员方法、静态属性、静态方法。
网友评论