1. OOP是什么?

    OOP是面向对象编程,面向对象编程是一种计算机编程架构。

    OOP的基本原则是计算机程序是由单个能起到子程序作用的单元或对象组合而成。

  2. 基本概念:

    1. 类:定义了事务的抽象特点。包含了数据的形式以及数据的操作。class 定义类。
    2. 对象:类的实例。new 运算符类实例化为对象。
    3. 成员变量:定义在类内的变量。类实例化为对象后,该变量称为对象的属性。
    4. 成员函数:定义在类内的方法。
    5. 重载:函数或者方法有同样的名称,但是参数列表不相同的情形。
  3. 什么是构造函数,什么是析构函数,作用是什么?

    1. 构造函数

      构造函数(方法)是对象创建完成后第一个被对象自动调用的方法。

      它存在于每个声明的类中,是一个特殊的成员方法。

      作用是执行一些初始化的任务。 PHP中使用 __construct() 声明构造方法,并且只能声明一个。

    2. 析构函数

      析构函数(方法)作用和构造方法正好相反,是对象被销毁之前最后一个被对象自动调用的方法。

      是PHP5中添加的内容,作用是用于实现在销毁一个对象之前执行一些特定的操作;

      诸如关闭文件和释放内存等。 使用__destruct()声明析构函数。

  4. 什么是魔术方法?

    1. 魔术方法时系统提供的,我们直接使用即可。
    2. 所有的魔术方法都是以 __ (两个下划线)开头的。
    3. 魔术方法是在满足某个条件时,由系统自动调用的
  5. 魔术方法有哪些?

    1. __construct() 构造函数
    2. __destruct() 析构函数
    3. __sleep() 串行化/序列化的时候用
    4. __wakeup() 反串行化/反序列化的时候用
    5. __toString() 将一个对象当做字符串来输出时调用
    6. __clone() 克隆对象时被调用
    7. __autoload() 实例化一个对象时,如果对应的类不存在,则该方法被调用
    8. __call() 调用方法,若方法存在、则直接调用;若不存在,则调用__call() 函数
    9. __set() 设置对象属性,若属性存在、则直接赋值;若不存在、则调用__set()函数
    10. __get() 获取对象属性,若属性存在、则直接返回;若不存在、则调用__get()函数
    11. __iseet() 检测一个对象的属性是否存在时被调
    12. __unset() 清除一个对象的属性时被调用
  6. OOP的三大特点?

    1. 封装性

      就是将一个类的使用和实现分开, 只保留部分接口和方法与外部联系,或者说只公开了一些供开发人员使用的方法。于是开发人员只需要关注这个类如何使用,而不用去关心其具体的实现过程,这样就能实现MVC分工合作,也能有效避免程序间相互依赖,实现代码模块间松藕合。

    2. 继承性

      就是子类自动继承其父级类中的属性和方法,并可以添加新的属性和方法或者对部分属性和方法进行重写。继承增加了代码的可重用性。PHP只支持单继承,也就是说一个子类只能有一个父类。

      记得有一道面试题问

      PHP是否支持多继承?答案:不可以,只支持单继承。

      如何实现多继承呢?答案:可以使用 interface 或 trait 实现 。

      参考地址:https://www.cnblogs.com/xiaqiuchu/articles/10393021.html

    3. 多态性

      子类继承了来自父级类中的属性和方法,并对其中部分方法进行重写。于是多个子类中虽然都具有同一个方法,但是这些子类实例化的对象调用这些相同的方法后却可以获得完全不同的结果,这种技术就是多态性。多态性增强了软件的灵活性。

  7. OOP的优点有哪些?

    1. 易维护

      采用面向对象思想设计的结构,可读性高,由于继承的存在,即使改变需求,那么维护也只是在局部模块,所以维护起来是非常方便和较低成本的。

    2. 质量高

      在设计时,可重用现有的,在以前的项目的领域中已被测试过的类使系统满足业务需求并具有较高的质量。

    3. 效率高

      在软件开发时,根据设计的需要对现实世界的事物进行抽象,产生类。使用这样的方法解决问题,接近于日常生活和自然的思考方式,势必提高软件开发的效率和质量。

    4. 易扩展

      由于继承、封装、多态的特性,自然设计出高内聚、低耦合的系统结构,使得系统更灵活、更容易扩展,而且成本较低。

  8. 方法重写

    // 如果从父类继承的方法不能满足子类的需求,可以对其进行改写;
    // 这个过程叫方法的覆盖(override),也称为方法的重写。
    // 实例中重写了 getUrl 方法: /***** 原来的 ****/
    class p {
    var $url;
    var $title function getUrl()
    {
    echo $this->url;
    }
    } /***** 继承后重写 ****/
    class s extends p {
    var $url;
    var $title function getUrl()
    {
    echo $this->url.'/'.$this->title;
    }
    }
  9. 面向对象中 public、protected、private 三种访问控制模式的区别是:

    1. public(公有):公有的类成员可以在任何地方被访问。
    2. protected(受保护):受保护的类成员则可以被其自身以及其子类和父类访问。
    3. private(私有):私有的类成员则只能被其定义所在的类访问。
  10. 接口 和 抽象类 分别是什么?有哪些区别?

    1. 抽象类

      抽象类通过 abstract 关键字来声明的。

      抽象类不能被实例化,只能使用 extends 继承抽象类。

      抽象类中至少包含一个抽象方法。

      抽象类中的抽象方法只是声明了其调用方式或参数,所有的抽象方法都是空的。

      抽象类中的抽象方法天生就是要被子类重写的。

      抽象类继承的时候,子类必须实现父类中的所有抽象方法。

      子类中的方法的访问控制必须和父类中的一样或者更为宽松;

      子类中定义了一个可选参数,而父类抽象方法的声明里没有,则也是可以正常运行的。

    2. 接口

      接口通过 interface 关键字来声明的。

      接口不能被实例化,只能使用 implements 实现接口。

      接口中的成员常量和方法都是 public 的,这是接口的特性。

      接口中的方法也只是声明了其调用方式或参数,所有的方法都是空的。

      接口中的方法天生就是要被子类实现的。

      接口实现的时候,类中必须实现接口中定义的所有方法,否则会报一个致命错误。

      类可以实现多个接口,用逗号来分隔多个接口的名称。

    3. 区别

      抽象类和接口实现的功能十分相似,最大的不同是接口能实现多继承。

  11. Static 关键字

    1. 声明类属性和方法为静态的,可以不用实例化类而直接访问。
    2. 静态属性不能通过一个类已实例化的对象类访问,但是静态方法可以访问。
    3. 静态方法不需要通过对象即可调用。所以 $this 在静态方法中不可以使用。
  12. Final 关键字

    1. PHP5中新增的。
    2. 如果父类中的方法被声明为final,则子类无法覆盖该方法。
    3. 如果一个类被声明为 final,则不能被继承。
  13. 多继承

    trait test_a
    {
    function fun_a()
    {
    echo "a";
    }
    } trait test_b
    {
    function fun_b()
    {
    echo "b";
    }
    } class test
    {
    use test_a, test_b;
    function fun_a()
    {
    echo 'ca';
    }
    } $t = new test;
    $t->fun_a();
    $t->fun_b();
  14. 序列化/反序列化

    1. 序列化:把本来不能直接存储的数据转换成可存储的数据,并且不会丢掉数据格式

      serialize();

    2. 反序列化:把序列化后的数据,转换成我们需要的格式

      unserialize();

    3. 案例

      // 数组
      $arr = array(
      'name'=>'mike',
      'birth'=>'0101',
      'sex'=>1
      ); //序列化
      $serialized_data = serialize($arr);
      echo $serialized_data;
      // 得到
      // a:3:{s:4:"name";s:4:"mike";s:5:"birth";s:4:"0101";s:3:"sex";i:1;} //反序列化
      $res = unserialize($serialized_data);
      var_dump($res);
      //得到
      /*
      array(3) {
      ["name"]=>
      string(4) "mike"
      ["birth"]=>
      string(4) "0101"
      ["sex"]=>
      int(1)
      }
      */
  15. 完成!!!

一次性搞懂 PHP 中面向对象的所有知识点。的更多相关文章

  1. 来一轮带注释的demo,彻底搞懂javascript中的replace函数

    javascript这门语言一直就像一位带着面纱的美女,总是看不清,摸不透,一直专注服务器端,也从来没有特别重视过,直到最近几年,javascript越来越重要,越来越通用.最近和前端走的比较近,借此 ...

  2. 帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)

    作为一名前端工程师,必须搞懂JS中的prototype.__proto__与constructor属性,相信很多初学者对这些属性存在许多困惑,容易把它们混淆,本文旨在帮助大家理清它们之间的关系并彻底搞 ...

  3. 让你彻底搞懂JS中复杂运算符==

    让你彻底搞懂JS中复杂运算符== 大家知道,==是JavaScript中比较复杂的一个运算符.它的运算规则奇怪,容易让人犯错,从而成为JavaScript中“最糟糕的特性”之一. 在仔细阅读了ECMA ...

  4. 轻松搞懂Java中的自旋锁

    前言 在之前的文章<一文彻底搞懂面试中常问的各种“锁”>中介绍了Java中的各种“锁”,可能对于不是很了解这些概念的同学来说会觉得有点绕,所以我决定拆分出来,逐步详细的介绍一下这些锁的来龙 ...

  5. 彻底搞懂 JS 中 this 机制

    彻底搞懂 JS 中 this 机制 摘要:本文属于原创,欢迎转载,转载请保留出处:https://github.com/jasonGeng88/blog 目录 this 是什么 this 的四种绑定规 ...

  6. 一文搞懂 js 中的各种 for 循环的不同之处

    一文搞懂 js 中的各种 for 循环的不同之处 See the Pen for...in vs for...of by xgqfrms (@xgqfrms) on CodePen. for &quo ...

  7. 彻底搞懂JavaScript中的继承

    你应该知道,JavaScript是一门基于原型链的语言,而我们今天的主题 -- "继承"就和"原型链"这一概念息息相关.甚至可以说,所谓的"原型链&q ...

  8. 一文彻底搞懂Java中的环境变量

    一文搞懂Java环境变量 记得刚接触Java,第一件事就是配环境变量,作为一个初学者,只知道环境变量怎样配,在加上各种IDE使我们能方便的开发,而忽略了其本质的东西,只知其然不知其所以然,随着不断的深 ...

  9. 面试阿里,首先要掌握的 Java 泛型,帮你一次性搞懂!

    引言 泛型是Java中一个非常重要的知识点,在Java集合类框架中泛型被广泛应用.本文我们将从零开始来看一下Java泛型的设计,将会涉及到通配符处理,以及让人苦恼的类型擦除. 泛型基础 泛型类 我们首 ...

随机推荐

  1. Codeforces1144A(A题)Diverse Strings

    A. Diverse Strings A string is called diverse if it contains consecutive (adjacent) letters of the L ...

  2. HDU 6047 贪心思维题

    Maximum Sequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  3. 【Oracle】CentOS7/CentOS8命令行重启Oracle 11G R2

    写在前面 按照读者朋友的要求写了一篇<[Oracle]CentOS7/CentOS8命令行安装Oracle 11G R2>,由于读者完全是按照我的安装方式安装的Oracle数据库,也是将O ...

  4. SQL——处理列中NULL值

    处理NULL值 - 数据库中某列为NULL值,使用函数在列值为NULL时返回固定值.    SQLServer:ISNULL(col,value)        示例:SELECT ISNULL(co ...

  5. WordPress 伪静态规则(IIS/Apache/Nginx)

    不少朋友总是询问 WordPress 如何添加伪静态规则,今天倡萌就总结一下 Apache/Nginx 三种环境下的伪静态规则,希望对大家有所帮助. 检测主机是否支持伪静态的方法:在WP后台 > ...

  6. 由一次安全扫描引发的思考:如何保障 API 接口的安全性?

    引言 前段时间,公司对运行的系统进行了一次安全扫描,使用的工具是 IBM 公司提供的 AppScan . 这个正所谓不扫不要紧,一扫吓一跳,结果就扫出来这么个问题. 我们的一个年老失修的内部系统,在登 ...

  7. MANIFEST.MF是个什么?

    MANIFEST.MF是个什么? 写这篇文件主要记录JRA文件里面到底是什么?然后MANIFEST.MF又是什么?Springboot 如何只有Main方法就可以运行的? Springboot项目打包 ...

  8. IT笑话十则(一)

    一.下班前发给你 客户:“这个图下班之前必须发给我!” 设计师:“好的!” 第二天清早. 客户:“图怎么还没发过来?” 设计师:“我还没下班呢…”   二.受伤的老三 行业老大与老二PK,受伤的并非对 ...

  9. 泛微 e-cology OA 前台SQL注入漏洞

    0x00概述 该漏洞是由于OA系统的WorkflowCenterTreeData接口在收到用户输入的时候未进行安全过滤,oracle数据库传入恶意SQL语句,导致SQL漏洞. 0x01影响范围 使用o ...

  10. 记一次使用windbg排查内存泄漏的过程

    一.背景 近期有一个项目在运行当中出现一些问题,程序顺利启动,但是观察一阵子后发现内存使用总量在很缓慢地升高, 虽然偶尔还会往下降一些,但是总体还是不断上升:内存运行6个小时候从33M上升到80M: ...