php面向对象 封装继承多态 接口、重载、抽象类、最终类总结
1、面向对象 封装继承多态 接口、重载、抽象类、最终类
面向对象 封装继承多态
首先,在解释面向对象之前先解释下什么是面向对象?
[面向对象]
1、什么是类?
具有相同属性(特征)和方法(行为)的一系列个体的集合,类是一个抽象的概念
2、什么是对象?
从类中拿到的具有具体属性值得个体,称为对象,对象是一个具体的个体
所以,面向对象即我们专注对象来处理问题,通过从一个个具有属性和功能的类中拿到对象来处理问题。
下面我们再来细说下面向对象的三大特征:继承/封装/多态
一、继承
在PHP中我们主要通关Extends关键字来实现继承 ->class Student extends Person{}
下面是几个比较重要的注意事项:
①子类只能继承父类的非私有属性。
②子类继承父类后,相当于将父类的属性和方法copy到子类,可以直接使用$this调用该属性;
③PHP只能单继承,不支持一个类继承多个类。但是一个类可以进行多层继承(即A继承于B,而C又继承于A,C通过A间接继承了B)
二、封装
类实现封装是为了不让外面的类随意的修改一个类的成员变量,所以在定义一个类的成员的时候,我们使用private关键字设置这个成员的访问权限
只能被这个类的其他成员方法调用,而不能被其他类中的方法调用,即通过本类中提供的方法来访问本类中的私有属性。
①所以在该类中我们会提供一个访问私有属性的方法
②然后我们一般会定义两个方法来实现对一个变量的操作,即:get()与set()方法。
代码示例如下:

class Person{
private $name;
private $age; public function __construct($name,$age){
$this->name = $name;
$this->age = $age;
}
function setAge($age){
if($age>=0&&$age<=120){
$this->age = $age;
}else{
error_log("年龄设置有误!");
}
} function getAge(){
return $this->age;
}
public function say(){
echo "我叫{$this->name},我今年{$this->age}岁了";
} function __get($name){
switch ($name) {
case 'name':
return $this ->$name."这是读取时加的文字";
case 'age':
return "0".$this ->$name;
default:
return $this ->$name;
} }
function __set($key,$value){ if($key=="name"){
$this->$key = $value."这是设置时加的文字<br>";
}else{
$this->$key = $value;
}
}
function __isset($name){
return isset($this->$name);
} function __unset($name){
if($name=="age"){
return;
}
unset($this->$name);
}
} $zhangsan = new Person("zhangsan",14);
$zhangsan->setAge(12);
echo $zhangsan->getAge()."<br>";
var_dump(isset($zhangsan->name));
unset($zhangsan->age);
echo $zhangsan->age;

三、多态
什么是多态?
一个类,被多个子类继承,如果这个类的某个方法,在多个子类中,表现出不同的功能,我们称这种行为为多态。(同一个类的不同子类表现出不同的形态)
那么我们如何来实现多态呢?
子类继承父类 ->子类重写父类方法 ->父类引用指向子类对象
abstract class Person{ 注:父类使用abstract关键字修饰
abstract function say();
}
class Chinese extends Person{ 注:子类重写父类方法
function say(){
echo "我是中国人<br>";
}
}
class English extends Person{ 注:子类重写父类方法
function say(){
echo "我是英国人";
}
}
$zhangsan = new Chinese();
$zhangsan->say();
$z = new English();
$z->say();
Person $p = new Chinese(); 注:父类引用指向子类对象
上述代码中,两个子类都是继承自同一父类,但因为都重写了父类的方法,表现出了不同的形态
* 四、单例设计模式
单例模式也叫单态模式
可以保证一个类只能有一个对象实例
实现要点:
①构造函数私有化,不允许使用new关键字创建对象。
②对外提供获取对象的方法,在方法中判断对象是否为空,如果为空则创建对象并返回,如果不为空则直接返回
③实例对象的属性以及获取对象的方法必须都是静态的。
④之后,创建对象只能使用我们提供的静态方法。
示例代码如下:
class Singleton{
static public $Single = null;
private function __construct(){}
static function getSingle(){
if(!self::$Single){
self::$Single = new Singleton();//self代指类名 new Singleton()和newself()是完全一样的
} return self::$Single;
} function __destruct(){
echo "我被销毁了<br>";
}
}
$s1 = Singleton::getSingle();
$s1 = Singleton::getSingle();
$s1 = Singleton::getSingle();
抽象类、抽象方法、重载、接口
抽象类
定义:一个抽象的不能被实例化的类。
定义形式(abstract关键字):
abstract class 类名{
// ...
}
抽象方法
定义:一个只有方法头,没有方法体的方法
定义形式(用abstract修饰方法)
abstract class 类名{
abstract function 方法名(形参列表); // 没有方法体,结尾分号不能省略
}
抽象类和抽象方法的细节:
一个抽象方法必须在抽象类中,即方法为抽象的,那么其所在的类也不是是抽象的;
抽象类中可以没有抽象方法;
子类继承了父类,那么要么实现(“重写”)父类的抽象方法,要么在次定义为抽象的。
重载
含义:在“通常面向对象语言”中是指一个类可以名字相同但形参不同的方法的现象(如java)。
如:
class A{
function f(){
}
function f($a){
}
function f($a,$b){
}
}
php中的重载
含义:是指当对一个对象或类使用其未定义的属性或方法的时候,其中的一些“处理机制”。
属性重载:
含义:对一个对象的不存在的属性进行使用的时候,这个类种预先设定好的应对方法(处理机制)
属性,本质就是一个变量,其有4个操作:
取值:当对一个对象的不存在的属性进行“取值”的时候,就会自动调用方法:__get();
赋值:当对一个对象的不存在的属性进行“取值”的时候,就会自动调用方法:__set();
判断(isset):当对一个对象的不存在的属性进行“判断”的时候,就会自动调用方法:__isset();
判断(isset):当对一个对象的不存在的属性进行“判断”的时候,就会自动调用方法:__unset()。
__set($属性名,值):
含义:当对一个对象的不存在属性进行“赋值”的时候就会自动调用这个内部的魔术方法,它有两个形参,分别代表对不存在的属性进行赋值的时候的“属性名”和“属性值”。
这个方法结合__get()方法,往往可以使我们定义的类,就有一种“可简便扩展属性”的特性,即类(或对象)的属性,可以更为方便自由,如下所示:
class A{
protected $prop_list = array();
function __set($p,$v){
$this->prop_list[$p] = $v;
}
function __get($p){
return $this->prop_list[$p];
}
}
__isset()
含义:当对一个对象的不存在属性进行“判断”的时候就会自动调用这个内部的魔术方法。
__unset()
含义:当对一个对象的不存在属性进行“销毁”的时候就会自动调用这个内部的魔术方法。
方法重载
当对一个对象的不存在的实例方法进行“调用”的时候会自动调用类中的__call()这个魔术方法;
当对一个对象的不存在的静态方法进行“调用”的时候会自动调用类中的__callstatic()这个魔术方法。
php中实现通常的面向对象语言的“方法重载”(利用__call()和__callstatic()方法),如:
<?php
class A{
function __call($methodName,$arguments){
switch ($methodName) {
case 'f1': // 调用了f1这个不存在的方法
# 调用了方法名为f1的这一系列重载方法
if(count($arguments) == 0){
// 这里拿这些参数做这个方法的事情...
}else if(count($arguments) == 1){
// 这里拿这些参数做这个方法的事情...
}else if(count($arguments) == 2){
// 这里拿这些参数做这个方法的事情...
}else if(count($arguments) == 3){
// 这里拿这些参数做这个方法的事情...
}
// ...
break;
case 'f2': // 调用了f2这个不存在的方法
# 调用了方法名为f2的这一系列重载方法
if(count($arguments) == 0){
// 这里拿这些参数做这个方法的事情...
}else if(count($arguments) == 1){
// 这里拿这些参数做这个方法的事情...
}else if(count($arguments) == 2){
// 这里拿这些参数做这个方法的事情...
}else if(count($arguments) == 3){
// 这里拿这些参数做这个方法的事情...
}
// ...
break;
default:
break;
}
}
}
?>
接口
定义形式
interface 接口名{
常量1;
常量2;
...
抽象方法1;
抽象方法2;
...
}
说明:
接口中只有常量(接口常量)和抽象方法两种成员;
接口常量的使用形式为:接口名称::常量名称;
接口中的抽象方法,不要使用abstract修饰,也需要使用访问控制修饰符,因为其天然就是Public;
php中接口和类一样也可以继承(接口继承接口)。
还谈php和java面向对象
相同点:
抽象类和抽象方法,及它们之间的细节都一样;
php的接口和java的接口都一样。
不同点:
重载不一样,php重载和其他面向对象语言的重载不同,而java和其他面向对对象语言的重载一样。
最终类final class:
在定义一个类的时候,在class关键字前面使用final关键,则表示该类“不可继承”(禁止继承);
如下:
final class 类名{
//类成员定义。。。。
}
最终方法
就是在方法定义的前面,使用关键字final,表示该方法“不可覆盖”——禁止覆盖。
抽象类
定义:一个抽象的不能被实例化的类。定义形式(abstract关键字):
abstract class 类名{ // ...}123抽象方法
定义:一个只有方法头,没有方法体的方法
定义形式(用abstract修饰方法)
abstract class 类名{ abstract function 方法名(形参列表); // 没有方法体,结尾分号不能省略}123抽象类和抽象方法的细节:
一个抽象方法必须在抽象类中,即方法为抽象的,那么其所在的类也不是是抽象的;抽象类中可以没有抽象方法;子类继承了父类,那么要么实现(“重写”)父类的抽象方法,要么在次定义为抽象的。重载
含义:在“通常面向对象语言”中是指一个类可以名字相同但形参不同的方法的现象(如java)。
如:
class A{ function f(){
} function f($a){
} function f($a,$b){
}}1234567891011php中的重载
含义:是指当对一个对象或类使用其未定义的属性或方法的时候,其中的一些“处理机制”。
属性重载:
含义:对一个对象的不存在的属性进行使用的时候,这个类种预先设定好的应对方法(处理机制)属性,本质就是一个变量,其有4个操作:
取值:当对一个对象的不存在的属性进行“取值”的时候,就会自动调用方法:__get();赋值:当对一个对象的不存在的属性进行“取值”的时候,就会自动调用方法:__set();判断(isset):当对一个对象的不存在的属性进行“判断”的时候,就会自动调用方法:__isset();判断(isset):当对一个对象的不存在的属性进行“判断”的时候,就会自动调用方法:__unset()。__set($属性名,值):
含义:当对一个对象的不存在属性进行“赋值”的时候就会自动调用这个内部的魔术方法,它有两个形参,分别代表对不存在的属性进行赋值的时候的“属性名”和“属性值”。
这个方法结合__get()方法,往往可以使我们定义的类,就有一种“可简便扩展属性”的特性,即类(或对象)的属性,可以更为方便自由,如下所示:
class A{ protected $prop_list = array(); function __set($p,$v){ $this->prop_list[$p] = $v; } function __get($p){ return $this->prop_list[$p]; }}123456789__isset()
含义:当对一个对象的不存在属性进行“判断”的时候就会自动调用这个内部的魔术方法。__unset()
含义:当对一个对象的不存在属性进行“销毁”的时候就会自动调用这个内部的魔术方法。方法重载
当对一个对象的不存在的实例方法进行“调用”的时候会自动调用类中的__call()这个魔术方法;
当对一个对象的不存在的静态方法进行“调用”的时候会自动调用类中的__callstatic()这个魔术方法。
php中实现通常的面向对象语言的“方法重载”(利用__call()和__callstatic()方法),如:
<?phpclass A{
function __call($methodName,$arguments){ switch ($methodName) { case 'f1': // 调用了f1这个不存在的方法 # 调用了方法名为f1的这一系列重载方法 if(count($arguments) == 0){ // 这里拿这些参数做这个方法的事情... }else if(count($arguments) == 1){ // 这里拿这些参数做这个方法的事情... }else if(count($arguments) == 2){ // 这里拿这些参数做这个方法的事情... }else if(count($arguments) == 3){ // 这里拿这些参数做这个方法的事情... } // ... break; case 'f2': // 调用了f2这个不存在的方法 # 调用了方法名为f2的这一系列重载方法 if(count($arguments) == 0){ // 这里拿这些参数做这个方法的事情... }else if(count($arguments) == 1){ // 这里拿这些参数做这个方法的事情... }else if(count($arguments) == 2){ // 这里拿这些参数做这个方法的事情... }else if(count($arguments) == 3){ // 这里拿这些参数做这个方法的事情... } // ... break; default: break; } }}?>12345678910111213141516171819202122232425262728293031323334353637接口
定义形式
interface 接口名{ 常量1; 常量2; ... 抽象方法1; 抽象方法2; ...}12345678说明:
接口中只有常量(接口常量)和抽象方法两种成员;接口常量的使用形式为:接口名称::常量名称;接口中的抽象方法,不要使用abstract修饰,也需要使用访问控制修饰符,因为其天然就是Public;php中接口和类一样也可以继承(接口继承接口)。还谈php和java面向对象
相同点:
抽象类和抽象方法,及它们之间的细节都一样;php的接口和java的接口都一样。不同点:
重载不一样,php重载和其他面向对象语言的重载不同,而java和其他面向对对象语言的重载一样。--------------------- 作者:宿罪 来源:CSDN 原文:https://blog.csdn.net/ydxlt/article/details/50667454 版权声明:本文为博主原创文章,转载请附上博文链接!
php面向对象 封装继承多态 接口、重载、抽象类、最终类总结的更多相关文章
- python面向对象(封装,继承,多态)
python面向对象(封装,继承,多态) 学习完本篇,你将会深入掌握 如何封装一个优雅的借口 python是如何实现继承 python的多态 封装 含义: 1.把对象的属性和方法结合成一个独立的单位, ...
- Java基础——面向对象(封装——继承——多态 )
对象 对象: 是类的实例(实现世界中 真 实存在的一切事物 可以称为对象) 类: 类是对象的抽象描述 步骤: 1.定义一个类 (用于 描述人:) ( * 人:有特征和行为) 2.根据类 创建对象 -- ...
- 1.Java基础-面向对象编程思想(封装继承多态接口)
封装: 1.定义:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别. 2.封装的目的是:增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,一特定的 ...
- python面向对象编程 继承 组合 接口和抽象类
1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均用点来访问自己的 ...
- Py修行路 python基础 (十五)面向对象编程 继承 组合 接口和抽象类
一.前提回忆: 1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均 ...
- C++学习笔记 封装 继承 多态 重写 重载 重定义
C++ 三大特性 封装,继承,多态 封装 定义:封装就是将抽象得到的数据和行为相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成类,其中数据和函数都是类的成员,目的在于将对 ...
- <python基础>封装,继承,多态,重写,重载
什么是封装? 所谓的面向对象就是将我们的程序模块化,对象化,把具体事物的特性属性和通过这些属性来实现一些动作的具体方法放到一个类里面,这就是封装.封装是我们所说的面相对象编程的特征之一.除此之外还有继 ...
- java面向对象(封装-继承-多态)
框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...
- Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态)
Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态) 1.面向对象的三大特性: (1)继承 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以 ...
随机推荐
- [UE4]网络游戏重点思考
一.哪些逻辑放服务器,哪些逻辑放客户端? 二.它们之间怎么通信?会不会覆盖? 三.服务器应该做哪些验证?(防止外挂)
- GDAL 地图切片层级计算公式
作者: 蔡建良 2016-7-6 地图瓦片起始层数: xMin=栅格数据最小经度 xMax=栅格数据最大经度 起始层数=Log(第0层经纬度跨度/当前地图的经纬度跨度,2) minzoom = (in ...
- 十三篇系列:king转折点,wooga瓶颈,supercell营收结构
转自:http://gamerboom.com/archives/95125 十三篇系列:king的历史转折点,wooga的瓶颈,supercell的营收结构 第一篇 这句话In other word ...
- mysql空间类型使用笔记
创建表,填充测试数据 create table geom1(id int not null auto_increment primary key,geo geometry); )); )); sele ...
- 物体检测之FPN及Mask R-CNN
对比目前科研届普遍喜欢把问题搞复杂,通过复杂的算法尽量把审稿人搞蒙从而提高论文的接受率的思想,无论是著名的残差网络还是这篇Mask R-CNN,大神的论文尽量遵循著名的奥卡姆剃刀原理:即在所有能解决问 ...
- Phpstorm的强大功能
你是否也是重复,重复,一直重复的打着重复的代码? 你是否也一直重复重复 的 Ctrl+c .Ctrl+v? 当你看到此项操作的时候就会发现,原来复制粘贴还能这么玩儿... 演示效果(以phpExcel ...
- mysql:视图,触发器,事务,存储过程,函数。
一 视图 1 什么是视图:视图其实就是通过查询得到一张表并且保存下来,就是一张虚拟的表,并非真实存在,比如我们将两个表在终端通过(inner join)内链接起来,那么我们得到的这个表就叫做视图,其 ...
- vue-cli 项目搭建
vue-cli 项目搭建 1.首先需要安装nodejs(安装省略). 2.用node安装vue-cli. npm install -g vue-cli 3.新建目录用来存放工程. 新建一个vue项 ...
- ES6学习笔记<二>arrow functions 箭头函数、template string、destructuring
接着上一篇的说. arrow functions 箭头函数 => 更便捷的函数声明 document.getElementById("click_1").onclick = ...
- SVG 学习<七> SVG的路径——path(1)直线命令、弧线命令
目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...