K在上一次的基础篇中给大家介绍了一下关于PHP中数组和字符串的使用方法等,这一次,K决定一次性大放送,给大家分享一下PHP中面向对象的三大特性:封装、继承、多态三个方面的知识。

一、封装

  在PHP中,封装可以用三个子来概括:私有化。具体来说,是通过访问修饰符,将类中不需要外部访问的属性和方法进行私有化处理,来实现访问控制。

  那么封装的作用是什么?封装的作用主要有两点,一是方法封装,即将使用者关注的功能暴露,而隐藏其他使用者用不到的功能;二是属性封装,即对用户的数据进行控制,防止不合法的数据传输设置。

  那么封装操作是如何实现的?

  对于方法的封装,我们通过对方法前加private关键字来进行设置,即进行私有化处理。demo如下:

private function formatName(){} // 这个方法仅仅能在类内部使用$this调用
function showName(){
$this -> formatName();
}

  对于属性的封装,我们可以有两种方法来进行实现。

  一是通过自己提供的set/get方法来对私有化的属性进行设置/读取。demo如下:

private $age;
function setAge($age){
$this -> age = $age;
}
function getAge(){
return $this -> age;
}

  二是通过魔术方法来进行实现。demo如下:

private $age;
function __get($key){
return $this -> $key;
}
function __set($key,$value){
$this -> $key = $value;
}
$对象 -> age; >>> 访问对象私有属性时,自动调用__get()魔术方法,并且将访问的属性名传给__get()方法;
$对象 -> age = "11"; >>> 设置对象的私有属性时,自动调用__set()魔术方法,并且将设置的属性名以及属性值传给__set()方法;

  此外,有关封装的魔术方法主要有以下几种:

   ① __set():给类私有属性赋值时自动调用,调用时给对象传递两个参数,需要设置的属性名、属性值
   ② __get():读取类私有属性时自动调用,调用时给方法传递一个参数,需要读取的属性名
   ③ __isset():外部使用isset()函数检测私有属性时,自动调用。
   >>>类外部使用isset()检测私有属性,默认是检测不到的。即false
   >>>所以,我们可以使用__isset()函数,在自动调用时,返回内部检测结果。
   function __isset($key){
     return isset($this->$key);
   }
   当外部使用isset($对象名->私有属性)检测时,将自动调用上述__isset()返回的结果!
   ④ __unset():外部使用unset()函数删除私有属性时,自动调用。
   function __unset($key){
    unset($this->$key);
   }
   当外部使用unset($对象名->私有属性)删除属性时,自动将属性名传给__unset(),并交由这个魔术方法处理。

二、继承

  在PHP中,继承也可以用单词extends来概括。extends在子类上使用,可以让子类继承父类中的非私有属性和方法。demo如下:

class Student extends Person{}

  但是,在使用继承时,需要注意以下几点:

  ① 子类只能继承父类的非私有属性。
  ② 子类继承父类后,相当于将父类的属性和方法copy到子类,可以直接使用$this调用。
  ③ PHP只能单继承,不支持一个类继承多个类,但是一个类可以进行多层继承。
   >>> class Person{}
   class Chengnian extends Person{}
   class Student extends Chengnian{}
  Student类就同时具有了Chengnian类和Person类的属性和方法

  下面给大家介绍一下关于方法重写(方法覆盖)的一些知识。

  方法覆盖是指子类对继承父类中重名方法的重写或覆盖,而它的实现需要满足两个条件,一是子类继承父类;二是子类重写父类已有方法。

  那么如果我想要在调用父类中的方法,应该怎么做?我们可以通过如下代码实现:

parent::方法名();

  同理,在子类继承父类时,首先也要调用父类的构造函数来赋值,实现代码如下:

function __construct($name,$age,$school){
parent::__construct($name,$age);
$this -> school = $school;
}
// 其中name、age属性继承自父类,school属于子类

三、多态

  在PHP中,多态是最常用到的一种特性。所谓多态,是指同一个东西不同形态的展示。在PHP中,我们这样定义多态,一个类被多个子类继承,如果这个类的某个方法在多个子类中表现不同的功能,那么这种行为我们就称其为多态的实现。

  多态的实现必须要满足三个条件:一是子类继承父类,二是子类重写父类的方法,三是父类引用指向子类对象。

  多态的实现K用一个小小的demo来给大家进行演示,demo如下:

    abstract class Person{
abstract function say();
} class Chinese extends Person{ // 条件一:子类继承父类
function say(){ // 条件二:子类重写父类方法
echo "我说中文!<br>";
}
}
class English extends Person{ //条件一:子类继承父类
function say(){ // 条件二:子类重写父类方法
echo "I speak English!<br>";
}
} // Person $c = new Chinese(); // 父类引用指向子类对象,PHP中此形式行不通
// Person $e = new English(); function func(Person $p){ //PHP中的类型约束只存在与函数的形参
$p -> say();
}
func(new Chinese()); // 条件三:父类引用指向子类对象
func(new English()); // 条件三:父类引用指向子类对象

好了,以上就是K给大家带来的关于PHP面向对象中封装、继承、多态这三个特性的初步理解,如果对你有帮助的话,可不要忘了给K点个赞哟~

PHP的面向对象 — 封装、继承、多态的更多相关文章

  1. php面向对象 封装继承多态 接口、重载、抽象类、最终类总结

    1.面向对象 封装继承多态  接口.重载.抽象类.最终类 面向对象 封装继承多态  首先,在解释面向对象之前先解释下什么是面向对象? [面向对象]1.什么是类? 具有相同属性(特征)和方法(行为)的一 ...

  2. python面向对象(封装,继承,多态)

    python面向对象(封装,继承,多态) 学习完本篇,你将会深入掌握 如何封装一个优雅的借口 python是如何实现继承 python的多态 封装 含义: 1.把对象的属性和方法结合成一个独立的单位, ...

  3. Java基础——面向对象(封装——继承——多态 )

    对象 对象: 是类的实例(实现世界中 真 实存在的一切事物 可以称为对象) 类: 类是对象的抽象描述 步骤: 1.定义一个类 (用于 描述人:) ( * 人:有特征和行为) 2.根据类 创建对象 -- ...

  4. java面向对象(封装-继承-多态)

    框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...

  5. Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态)

    Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态) 1.面向对象的三大特性: (1)继承 ​ 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以 ...

  6. 浅谈学习C++时用到的【封装继承多态】三个概念

    封装继承多态这三个概念不是C++特有的,而是所有OOP具有的特性. 由于C++语言支持这三个特性,所以学习C++时不可避免的要理解这些概念. 而在大部分C++教材中这些概念是作为铺垫,接下来就花大部分 ...

  7. Java三大特性(封装,继承,多态)

    Java中有三大特性,分别是封装继承多态,其理念十分抽象,并且是层层深入式的. 一.封装 概念:封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将抽象得到的数据 ...

  8. OOP三大核心封装继承多态

    OOP支柱 3 个核心:封装 继承 多态 封装就是将实现细节隐藏起来,也起到了数据保护的作用. 继承就是基于已有类来创建新类可以继承基类的核心功能. 在继承中 另外一种代码重用是:包含/委托,这种重用 ...

  9. -1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口 区别 多态 包 访问权限 内部类 匿名内部类 == 与 equal

    java是纯粹的面向对象的语言 也就是万事万物皆是对象 程序是对象的集合,他们通过发送消息来相互通信 每个对象都有自己的由其他的对象所构建的存储,也就是对象可以包含对象 每个对象都有它的类型  也就是 ...

  10. python面向对象之继承/多态/封装

    老师说,按继承/多态/封装这个顺序来讲. 子类使用父类的方法: #!/usr/bin/env python # coding:utf-8 class Vehicle: def __init__(sel ...

随机推荐

  1. bootstrap快速入门笔记(三)响应式,行,列,偏移量,排序

    一,响应式列重置 .clearfix <div class="row"> <div class="col-xs-6 col-sm-3"> ...

  2. java.net.SocketException: Broken pipe 异常可能的原因

    org.apache.catalina.connector.ClientAbortException: java.net.SocketException: Broken pipe at org.apa ...

  3. apache配置多个虚拟目录站点

    错误的做法 网上查了几个资料,做法如下:比如想配置两个www.web1.com  www.web2.com站点 打开httpd.conf ,然后添加: <VirtualHost *:80> ...

  4. js鼠标移入移出事件会被子元素触发解决方法

    问题:js写了一个鼠标移入移出事件,但是发现会被内部子元素不断的触发 解决方法:建立一个空的div定位到需要触发的位置,然后设置大小和触发范围一样,最后将事件写在空的div上.

  5. memcache 启动 failed to start

    以为是 端口冲突,到注册表中直接改了memcache的注册表,还是启动不了.memcache运行不了,还能咋办,看防火墙有没有阻止程序运行呗 勾上,我的windows 上的memcache 就可以运行 ...

  6. tomcat流程原理解析

    tomcat的启动是通过Bootstrap类的main方法(tomcat6开始也可以直接通过Catlina的main启动) Bootstrap的启动 Bootstrap的main方法先new了一个自己 ...

  7. 关于WannaCry病毒的见解与预防,我有话说!

    好久没写博客了,自从定性专做技术扩展服务后,已经有两年半没有正式写过博客,要不是这次WannaCry病毒的厉害程度,我也懒得去写博客,为什么呢?写技术文章吗?两年多没有研究新的技术,没有什么好写的!所 ...

  8. 20170515-20170523学习计划---学习java(1)

    背景: 组内搞了一个读书会,我是负责人,我们学习的主题是java,为了更好服务读书会,所以安排一下学习计划,到时候在读书会上做分享. 这是第二次读书会,第一次讲了java的一些基本知识,这次只要学习对 ...

  9. JEESZ分布式框架简介

    声明:该框架面向企业,是大型互联网分布式企业架构,后期会介绍Linux上部署高可用集群项目. 项目基础功能截图(自提供了最小部分) 介绍 1.      项目核心代码结构截图 <modules& ...

  10. 每天一道Java题[5]

    题目 String.StringBuilder.StringBuffer有什么异同? 解答 相同点:String.StringBuilder.StringBuffer都可以用来存储字符串. 不同点: ...