在讲解这三大特性前,我们先讲访问修饰符。

php中有3中访问修饰符:public protected private;

public:表示公有的;可在本类、子类、对象实例中访问。

protected:表示受保护的;可在本类、子类中访问;不能在对象实例中访问。

private:表示私有的;可在本类中访问;不能在子类、对象实例中访问。

一、封装性

封装就是把抽取出来的数据和对数据的操作封装在一起,数据被保护在内部,程序的其他部分只有被授权的操作(方法)才能对数据进行操作。

  1. class Student{
  2. public $name;
  3. protected $age;
  4. private $play;
  5. public function __construct($name, $age){
  6. echo '我是Student类';
  7. $this->name = $name;
  8. $this->age = $age;
  9. }
  10. }
  11.  
  12. $student = new Student('moon', );

二、继承性

当多个类有很多共同属性和方法时,代码冗余;这时,我们可以将共有部分提取出来,封装成一个类;子类经过一些操作可以使用这个共有的父类,这个就叫继承。

语法结构:

class 父类名{}

class 子类名 extends 父类名{}

继承要素:

  • 一个子类只能继承一个父类(这里指直接继承);如果希望继承多个类的属性和方法,可以使用多层继承
  • 在子类中调用父类的构造方法 父类::__construct() 或者 parent::__construct()
  • 如果子类和父类的方法名相同(public,protected),我们称为方法覆盖或方法重写(override),看下面的多态性
  1. class Student{
  2. public $name;
  3. protected $age;
  4. private $play;
  5. public function __construct($name, $age){
  6. echo '我是Student类';
  7. $this->name = $name;
  8. $this->age = $age;
  9. }
  10. }
  11.  
  12. // Pupil类继承Student类
  13. class Pupil extends Student {
  14. public function testing(){
  15. echo '我是Pupil';
  16. }
  17. public function __construct($name, $age){
  18. parent::__construct($name, $age); // 调用父类的构造方法1
  19. // Student::__construct($name, $age); // 调用父类的构造方法2
  20. echo $this->name;
  21. echo $this->age;
  22. // echo $this->play; // 报错,父类private定义的属性不能被子类继承
  23. }
  24. }
  25.  
  26. new Pupil('sky', );
  27.  
  28. // 实现类的多层继承
  29. class A{
  30. public $name='AAA';
  31. }
  32. class B extends A{
  33. public $age=;
  34. }
  35. class C extends B{}
  36. $p = new C();
  37. echo $p->name; // 这里会输出AAA

三、多态性

  • 子类覆盖父类的方法(重写),必须要求父类、子类的方法名和参数个数完全一致
  • 子类调用父类的方法(protected/public),使用 父类名::方法名 或者 parent::方法名
  • 在实现方法重写的时候,访问修饰符可以不一样,但是子类方法的访问权限必须大于等于父类方法的访问权限
  1. class Student{
  2. public $name;
  3. protected $age;
  4. private $play;
  5. public function getPlay(){
  6. echo '我是Student';
  7. }
  8. }
  9.  
  10. // Pupil类继承Student类
  11. class Pupil extends Student {
  12. public function __construct(){
  13. parent::getPlay(); // 可以这样调用父类的方法
  14. }
  15.  
  16. public function getPlay(){
  17. echo '我是Pupil';
  18. }
  19. }
  20.  
  21. $p1 = new Pupil(); // 我是Student
  22. $p1->getPlay(); // 我是Pupil

扩展:

方法重载(overload)

基本概念:函数名相同,但参数的个数或参数的类型不同,达到调用同一个函数,可以区分不同的函数

在PHP5中虽然也支持重载,但是和其它语言还是有很大区别的,php中不能定义多个同名函数

PHP5中提供了强大的“魔术”函数,使用这些魔术函数,我们可以做到函数重载

这里我们要到到 __call,当一个对象调一个方法时,而该方法不存在,则程序会自动调用__call

php 面向对象三大特点:封装、继承、多态的更多相关文章

  1. 深入理解Java面向对象三大特性 封装 继承 多态

    1.封装 封装的定义: 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系 为什么需要封装: 封装符合面向对象设计原则的第一条:单一性原则,一个类 ...

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

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

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

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

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

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

  5. C++三大特性 封装 继承 多态

    C++ 三大特性 封装,继承,多态 封装 定义:封装就是将抽象得到的数据和行为相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成类,其中数据和函数都是类的成员,目的在于将对 ...

  6. JAVA的三大特征 封装继承多态- 简单总结

    简单总结一下 封装-即从很多类的抽取相同的代码 写在一个类里. 好处是 代码的重用,安全. 继承-减少代码的书写. 其好处也是 代码的重用. 多态- 把不同的子类对象都当作父类来看,可以屏蔽不同子类对 ...

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

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

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

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

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

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

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

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

随机推荐

  1. WebStorm10 控制台中文乱码解决方案

    工作时发现无论是使用ctrl+F搜索还是查看提交的注释中文都是口,看的本小白十分蛋疼菊紧,所以抽时间找了方法去搞定它. 首先点击左上角的File,选择Setting 然后选择Appearance &a ...

  2. iOS开发之线程间的MachPort通信与子线程中的Notification转发

    如题,今天的博客我们就来记录一下iOS开发中使用MachPort来实现线程间的通信,然后使用该知识点来转发子线程中所发出的Notification.简单的说,MachPort的工作方式其实是将NSMa ...

  3. 4、libgdx应用框架

    (原文:http://www.libgdx.cn/topic/29/4-libgdx%E5%BA%94%E7%94%A8%E6%A1%86%E6%9E%B6) 模块 作为核心.libgdx提供了六个接 ...

  4. recover all files with git

    leon@DGLIRUAN2 /F/linux/android/leon/workspace/AngoWidget (master) $ git log commit 2f847e3a858ecb2f ...

  5. SSH2——filter过滤器

    概述: 过滤器是Servlet2.3以上新添加的一个功能,其技术也是很强大的.通过Filter技术能够对WEBserver的文件进行拦截,从而实现一些特殊的功能. 在JSP开发应用中也是必备的技能之中 ...

  6. Js动态操作表格

    HTML <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" co ...

  7. JAVA入门[4]-IntelliJ IDEA配置Tomcat

    一.新建Maven Module测试站点 \ 二.配置Application Server 1.File->Setting,打开设置面板: 2.选中Application Servers,点击+ ...

  8. MPSOC之2——ubuntu环境配置及petalinux安装

    MPSOC的linux开发需要使用petalinux,选择Ubuntu操作系统. 1.Ubuntu 1.1. Ubuntu安装 版本16.04.03 vmare版本:12.0 安装时注意选择" ...

  9. 工作随笔——自动重发的凶手--feign

    公司使用的feign(https://github.com/OpenFeign/feign)作为http客户端. 开发时debug后端程序,发现同一个请求会多次收到. 为了判断是谁在搞鬼,在客户端和服 ...

  10. Object.assign()

    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign 说明 Ob ...