PHP面向对象详解:继承、封装与多态
首先,在解释面向对象之前先解释下什么是面向对象?
[面向对象]
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();
PHP面向对象详解:继承、封装与多态的更多相关文章
- OOP面向对象 三大特征 继承封装多态
OOP面向对象 ----三大特征 继承封装多态 面向对象(Object Oriented,OO)是软件开发方法.面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统.交互式界面.应用结构 ...
- 详解 继承(下)—— super关键字 与 多态
接上篇博文--<详解 继承(上)-- 工具的抽象与分层> 废话不多说,进入正题: 本人在上篇"故弄玄虚",用super();解决了问题,这是为什么呢? 答曰:子类中所有 ...
- Java面向对象详解
Java面向对象详解 前言:接触项目开发也有很长一段时间了,最近开始萌发出想回过头来写写以前学 过的基础知识的想法.一是原来刚开始学习接触编程,一个人跌跌撞撞摸索着往前走,初学的时候很多东西理解的也懵 ...
- java之面向对象详解
#############java面向对象详解#############1.面向对象基本概念2.类与对象3.类和对象的定义格式4.对象与内存分析5.封装性6.构造方法7.this关键字8.值传递与引用 ...
- php开发面试题---php面向对象详解(对象的主要三个特性)
php开发面试题---php面向对象详解(对象的主要三个特性) 一.总结 一句话总结: 对象的行为:可以对 对象施加那些操作,开灯,关灯就是行为. 对象的形态:当施加那些方法是对象如何响应,颜色,尺寸 ...
- C#基础-面向对象详解
面向对象详解 一.什么是面向对象 1>面向对象是一种程序设计思想 2>面向过程和面向对象是什么? 例如要把大象放冰箱怎么做? 面向过程:打开冰箱门->把大象扔进去->关上冰箱门 ...
- 菜鸟笔记 -- Chapter 6.4.2 详解继承
6.4.2 详解继承 6.4.2.1 继承入门 继承使得程序架构具有一定的弹性,在程序中复用一些已经定义完善的类不仅可以减少软件开发周期,也可以提高软件的可维护性和可扩展性.基本思想是基于某个父类 ...
- JS 面向对象详解
面向对象详解1 OO1.html <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...
- Java 面向对象详解
0 引言 接触项目开发也有很长一段时间了,最近开始萌发出想回过头来写写以前学过的基础知识的想法. 1 面向对象 面向对象(Object Oriented)是一种新兴的程序设计方法,或者是一种新的程序设 ...
随机推荐
- BWT转换对字符串进行编码
今天看了下bowtie 的论文, 里面描述了BWT转换的过程和bowtie的比对算法: NGS测序数据的数据量非常大, 为了更快的处理, 通常需要对数据进行压缩:而BWT实际上就是一种数据转换方法, ...
- Oracle查询优化--排序
--普通排序 SELECT * FROM emp ORDER BY sal DESC; --使用列序排序 DESC; --组合排序 DESC; --translate函数,参数分别用A.B.C表示 S ...
- iOS10.0 & Swift 3.0 对于升级项目的建议
iOS & Swift新旧版本更替, 在Apple WWDC大会开始之际, 也迎来了iOS 10.0, Swift 3.0 测试版, 到目前为止, 已经是测试版2.0, 每次更新都带来了新的语 ...
- [ATL/WTL]_[中级]_[保存CBitmap到文件-保存屏幕内容到文件]
场景: 1. 在做图片处理时,比方放大后或加特效后须要保存CBitmap(HBITMAP)到文件. 2.截取屏幕内容到文件时. 3.不须要增加第3方库时. 说明: 这段代码部分来自网上.第一次学atl ...
- 原型模式(prototype pattern)---------创造型模式
原型模式的缺点: 1.需要为每一个类配备一个克隆方法,而且该克隆方法位于一个类的内部,当对已有的类进行改造时,需要修改源代码,违背了开闭原则(open-closed discipline) 2.在实现 ...
- cesium图形上加载图片
<!DOCTYPE html> <html> <head> <!-- Use correct character set. --> <meta c ...
- day13<常见对象+>
常见对象(StringBuffer类的概述) 常见对象(StringBuffer类的构造方法) 常见对象(StringBuffer的添加功能) 常见对象(StringBuffer的删除功能) 常见对象 ...
- laravel 发送邮件
1)邮件配置(config/mail.php 配置文件) MAIL_DRIVER 邮箱驱动,laravel 支持 "smtp", &qu ...
- cmp()
cmp(x, y) 用于比较两个对象的大小,如果 x > y 返回 1 ,如果 x = y 返回 0 ,如果 x < y 返回 -1 In [23]: cmp(5, 2) Out[23]: ...
- C语言近程型(near)和远程型(far)的区别是什么?
DOS用一种分段结构来寻址计算机的内存,每一个物理存储位置都有一个可以用段一偏移量方式来访问的相关地址.例如,下面就是一个典型的段式地址: A000:1234 冒号左边的部分代表段地址(A00 ...