1、基本概念

1.1、面向对象的阶段概念

  • OOA:面向对象分析
  • OOD:面向对象设计
  • OOP:面向对象编程

1.2、类的概念

  面向对象中的类,实质上就是现实世界中一类有着相似属性事物抽象的概括,像鸟类、书类等;

1.2、对象的概念

  如果说实体对应着现实世界中一类事物抽象的概括,那对象就是这个抽象概念下具体的事物。当我们说书是一个实体,一个类时,那么具体的比如《西游记》就是一个对象;我们说人类作为一个类时,具体的姓名为张三的人就是一个实例,也就是对象。  

1.3、类的定义

  PHP中使用关键字 class 来定义类;

1.4、类的实例化

  类的实例化其实就是创建对象的过程,使用 new 关键字;

1.5、instanceof操作符

  用来判断一个对象是不是一个类的实例,其实就是判断一个对象是不是根据这个类创建的;

1.6、$this关键字

  $this关键字就是代表当前调用$this的对象,也就是,谁调用$this,$this就代表谁;

2、构造方法

  当我们实例化一个类时,默认的就会调用系统定义的构造方法 __construct() ,这个方法系统只会自动调用,但具体的定义需要我们自己去定义。比如我们需要在对象创建时就初始化对象,就可以在构造方法体中定义。

3、析构方法

语法:__destruct()
对象消失的几种情况:
    • 脚本执行完毕,对象字段消失;
    • unset() 对象;
    • 给一个对象变量重新赋值,原本的对象就会被覆盖消失;

析构方法的作用:这个方法本身不是用来销毁对象本身,而是用来销毁对象产生时所生成的外部资源。比如数据库连接资源等。

4、对象的传值与克隆

4.1、对象的传值

  每个对象在创建时都会被赋给一个对象内部编号,相当于对象的id。这个内部编号一方面对应着栈空间中对象的名字,另一方面对应着创建该对象时,在堆空间开辟的对象空间地址。

  对象的值传递,实质上就是将对象的内部编号复制一份,赋给传递的对象。两个对象有着相同的内部编号,就意味着,这两个对象变量对应着堆空间中相同的内存地址。

  对象的引用传递,实质上是将对象的内部编号地址赋值给传递的对象,两者还是指向同一片内存空间;

  以上说明可以看出,对象的赋值传递实质上的效果是相同的,最终都是指向了同一片内存空间,并没有开辟新的内存空间。

4.2、对象的克隆

  对象的克隆是利用魔术方法 __clone() 克隆一个已有的对象,赋值给一个新的对象。

  此处的克隆,并不是想对象的传值一般,赋值和被赋值的变量指向同一片内存空间,而是新开辟一片内存空间,并对应着不同的内部编号。

5、静态成员

5.1、静态成员的定义:

  所谓的静态成员,就是指这个成员不是某个对所单独拥有的,而是所有这个类的实例共同拥有的。也就是说,静态成员是属于类的;

  定义静态成员用关键字:static

5.2、静态属性

  访问方式:类名::$静态属性;

  当在类内访问本类的静态属性时,可以self关键字调用,格式:self::$静态属性。

5.3、静态方法

  访问方式:类名::方法名();

  与非静态方法的区别:从内存上看,两者其实是没有区别的,都是存在于用户代码区,由类进行管理。但从逻辑上讲,我们一般认为,非静态方法是各个对象独自占有的方法,而静态方法是所有对象共用的方法。

  因此,体现在语法上,二者的区别就只有一个:无论采用采用什么方式调用静态方法,都不可以使用$this关键字!因为$this关键字本身就体现了各个对象“单独”占用方法的意义。

  下图表明了类的静态成员与类的关系:

 

5.4、注意事项

  在静态成员和非静态成员的调用上,我们一般有一个标准做法:

  使用类调用静态变量,使用对象调用非静态变量;  

6、类常量

  • 声明:const 常量名;
  • 访问:类名::常量名;

7、类中所有成员

  不多说,一图即可:

8、类文件的自动加载

8.1、自动加载函数

  __autoload(类名),和其他魔术方法一样,系统只会自动调用,而没有函数体,用户可以自定义函数体;

8.2、自定义自动加载函数

  1. 定义一个可以加载文件的普通函数;

  2. 将该函数用 spl_auto_register(‘函数名’) 注册成自动加载函数;

8.3、自定义加载方法

8.3.1、静态方法的注册

  • spl_autoload_register(array(‘类名’,’方法名’));
  • spl_autoload_register(‘类名::方法名’);

8.3.2、非静态方法的注册

  • spl_autoload_register(array(对象变量,’方法名’));

8.3.3、注意事项

  方法的注册一定要在需要某个类之前。

9、对象的序列化与反序列化

9.1、基本概念

  • 序列化:将原始数据转换成可以用于保存和传输的字符串数据!

  • 反序列化:将序列化后的字符串,根据其记录的值和类型转换为原始数据!

9.2、普通数据的序列化与反序列化

  • 序列化: serialize(要序列化的数据);

  • 反序列化:unserialize(序列化后的数据);

9.3、对象的序列化与反序列化

  • 序列化:除了使用序列化函数外,也要在要对应的类中添加 __sleep() 方法,用来定义当此类派生的对象序列化时,哪些属性是要序列化的;

  • 反序列化:在类中添加 __wakeup() 方法,用来定义当此类派生的对象反序列化时,要做的事情,比如重新连接数据库等;

10、类的继承

  继承的本质不是把父类的代码复制到子类,而是通过继承链,找到相应的成员!

11、重写

  重写机制还是由继承链来决定的。当在子类中找到相应的方法后就不需要再向其父类查询了。

12、访问控制修饰符

  类内 继承链内 类外
public 可以访问 可以访问 可以访问
protected 可以访问 可以访问  
private 可以访问    

13、final最终类

  如果某个类从业务逻辑的角度看,应该是最终的类别,不应该被继承了,此时就应该使用final关键字声明该类为“最终类”!

14、抽象类

14.1、定义

  abstract类:也叫作抽象类,不能实例化对象,只能被继承

14.2、成员

  抽象类中的成员:不仅包括抽象方法,还包括普通成员(非抽象方法、属性、常量等)。

14.3、作用

  • 可以完成普通的继承,为其他的类提供公共的代码!

  • 用于规定子类中必须要完成的方法成员,规定子类的方法结构,有时候为了保证完成一系列功能相似的多种操作类的结构一致,我们要求这些类都继承自相同的一个抽象类!

14.4、注意事项

  • 继承抽象类的子类只有两种选择:

  • 实现抽象父类中的没有实现父类中的

15、接口

15.1、定义:

  接口不是类,接口是类的规范,类又是对象的规范!接口的名字也有一个约定俗成的做法,就是以大写的 I 开头

15.2、成员

  接口interface成员:
    • 接口常量:接口中的常量

    • 抽象方法:和普通的抽象方法相似,只不过必须声明为 public ,且省略了关键字 abstract。这是因为接口中只存在抽象方法,所有省略了abstract

15.3、作用

  是一种纯粹的规范或规定,规定该接口的下级类必须要实现的公共的方法!

15.4、注意事项

  实现接口的子类只有两种选择:
    • 实现接口中的所有抽象方法(完善方法体),作为普通类;

    • 没有实现接口中的所有抽象方法,作为抽象类,被下一级子类继承实现;

15.5、接口和抽象类的比较

  • 从逻辑和结构上看,接口可以看成是抽象类的一个“子集”,都可以规定下级类的内部结构,只是接口里面只能有接口常量和公共抽象方法!

  • 接口比抽象类还要“抽象”,是一种纯粹的规范!接口甚至都不是类,是类的纯粹的规范!

  • PHP不支持多继承,但是支持多实现,也就是说,一个类可以同时实现多个接口!这也是接口和抽象类的最最本质的区别!

16、重载

16.1、重载的定义

重载指的是对不可访问的成员的处理!

不可访问有两种情况:

    • 该成员不存在;
    • 没有权限去访问(比如私有成员);

没有权限去访问(比如私有成员)

16.2、重载的分类

16.2.1、属性重载

  • __set(属性名, 属性值):一旦定义了__set方法,为不可访问的属性赋值的时候就会自动执行该方法。此时,处理权就交给用户自己了。这里可以设置是否允许用户从外界增加不存在的属性。

  • __get(属性名):一旦定义了__get方法,获取不可访问的属性的值时候,就会自动执行该方法。此时,处理权就交给用户自己了!

  • __unset(属性名):一般来说,可以通过unset函数删除对象的某个公开的属性,但是如果该属性是不可访问的,则会自动执行__unset方法进行处理!究竟是否可以删除成功,还是取决于__unset的内部实现!

  • __isset(属性名):如果该属性是不可访问的属性,判断这个属性是否存在的时候,会自动触发该方法的执行!

16.2.2、方法重载

  • __call(方法名, 参数数组):当调用一个不可访问的对象方法(非静态方法),会自动执行该魔术方法!

  • __callstatic(方法名, 参数数组):当调用一个不可访问的类方法(静态方法)的时候,会自动执行该魔术方法,需要在方法名的前面加上static。

17、魔术方法和魔术常量

17.1、魔术方法

你全都了解吗?

  • __construct()
  • __destruct()
  • __clone()
  • __sleep()
  • __wakeup()
  • __get()
  • __set()
  • __unset()
  • __isset()
  • __call()
  • __callstatic()

17.2、魔术常量

  • __CLASS__
  • __METHOD__
  • __FILE__
  • __DIR__
  • __LINE__
  • __FUNTION__

18、类与对象相关函数

  • class_exists()
  • interface_exists()
  • method_exists()
  • get_class()
  • get_parent_class()
  • get_class_methods()
  • get_class_vars()
  • is_object

19、命名空间

19.1、空间成员与子空间

  • 空间成员:函数、类和常量

  • 子空间:namespace A\B\C;表示创建一个名为C的子空间,并A空间和B空间也一起创建了!

19.2、空间成员的访问

  • 非限定名称访问:只能访问本空间内的成员,不用指定空间名;

  • 限定名称访问:从当前空间访问其子空间的时,可以使用限定名称访问!

    • 语法形式:子空间名\成员名;

  • 完全限定名称访问:直接从跟空间开始使用绝对路径访问;

20.3、空间引入

  当一个文件 f1 中空间 A 载入到另一个文件 f2 中(B是该文件中的空间)的时候,在 f2 中使用空间时,就出现了空间引入的问题。

  需注意的是,文件的引入是在代码执行阶段进行的,而 f2 中的 B 空间在引入之前命名,也就导致了 B 空间是默认的空间,当我们在引入语句后使用非限定成员访问时,会自动访问 f2 文件中的 B 空间。所以对引入空间的使用要较为慎重 ;

  如果 B 空间和 A 空间没有关系,则在 f2 中使用 A 空间时,要用完全限定名称访问;

  如果 B 空间是 A 空间的父空间,则在 f2 中使用 A 空间时,除了用完全限定名称访问,还可以使用限定名称访问;

20.4、空间类的引入

语法形式:use 空间名\类名 || use 空间名\类名 as 新的类名;

使用的时候,如果引入的类名和本文件中的类名相同,可以使用 use 空间名\类名 as 新的类名 来为引入的类定义一个别名。

PHP面向对象编程知识要点的更多相关文章

  1. JAVA基础知识之面向对象编程知识汇总

    JAVA基础课程部分面向对象已经学习完成,知识结构如下: 总体知识框架: 类的结构: 面向对象编程三大特征: 关键字和抽象类接口等: 常见知识汇总: 成员变量和局部变量比较 有无返回值方法比较: 权限 ...

  2. javascript的面向对象思想知识要点

    获取数据类型 typeof undefined:访问某个不存在的或未经赋值的变量时就会得到一个 undefined,用typeof 获取类型,得到的也是undefined;null:它不能通过java ...

  3. PHP面向对象编程 对象的基本概念 PHP面向对象的基本实践 PHP面向对象的高级实践 PHP面向对象的特殊实践

    再次梳理一下面向对象编程的要点. 此文是以php为例,但思想是通用的. 总结的PHP面向对象编程笔记 对象的基本概念 对象的基本构成 对象包含两部分 一.对象的组成元素 是对象的数据模型,用于描述对象 ...

  4. Python 编程核心知识体系-模块|面向对象编程(三)

    模块 面向对象编程

  5. 面向对象编程(OOP)基础知识(一)

    Java是一个支持并发.基于类和面向对象的计算机编程语言. 下面列出了面向对象软件开发的优点: 1.代码开发模块化,更易维护和修改. 2.代码复用. 3.增强代码的可靠性和灵活性. 4.增加代码的可理 ...

  6. 1.23 Python知识进阶 - 面向对象编程

    一.编程方法 1.函数式编程:"函数式编程"是一种"编程范式"(programming paradigm),也就是如何编写程序的方法论.它属于"结构化 ...

  7. php面向对象编程(oop)基础知识示例解释

    面向对象并不是一种技术,而是一种思想,是一种解决问题的最基本的思维方式!如何理解使用?OOP:面向对象编程 (直接代码说明) 1.面向对象的基本概念 示例demo: <?php header(& ...

  8. C# 篇基础知识3——面向对象编程

    面向过程的结构化编程,例如1972年美国贝尔研究所推出的C语言,这类编程方式重点放在在定函数上,将较大任务分解成若干小任务,每个小任务由函数实现,分而治之的思想,然而随着软件规模的不断扩张,软件的复杂 ...

  9. 进击的Python【第六章】:Python的高级应用(三)面向对象编程

    Python的高级应用(三)面向对象编程 本章学习要点: 面向对象编程介绍 面向对象与面向过程编程的区别 为什么要用面向对象编程思想 面向对象的相关概念 一.面向对象编程介绍 面向对象程序设计(英语: ...

随机推荐

  1. PHP加密3DES报错 Call to undefined function: mcrypt_module_open() 的解决方法

    我也是PHP新手,通过w3cschool了解了一下php基本原理之后就开写了.但仍是菜鸟. 先不管3DES加密的方法对不对,方法都是网上的,在运行的时候报了个错,把小弟整死了.找来找去终于自己摸出了方 ...

  2. [原]openstack-kilo--issue(六):Authorization Failed: The resource could not be found. (HTTP 404)

    =======1.问题点:====== 在安装调试openstack-kilo版本的时候,使用keystone endpoint-list的时候出现了问题. 如下: [root@controller ...

  3. glibc-2.15编译error: linker with -z relro support required

    ./configure --prefix=/usr/local/glibc-2.15 configure: error: you must configure in a separate build ...

  4. ELF Format 笔记(六)—— 字符串表

    ilocker:关注 Android 安全(新入行,0基础) QQ: 2597294287 字符串表中包含若干以 null 结尾的字符串,这些字符串通常是 symbol 或 section 的名字.当 ...

  5. tar 解压出错

    今天下载了一个Linux内核文件,解压的时候出现了这样的错误: gzip: stdin: unexpected end of file tar: Unexpected EOF in archive t ...

  6. DirectX API 编程起步 #01 项目设置

    =========================================================== 目录: DirectX API 编程起步 #02 窗口的诞生 DirectX A ...

  7. 大话设计模式C++版——原则和引言

    转贴请注明转自:http://blog.csdn.net/gufeng99/article/details/45832711 读程杰的<大话设计模式>有一段时间了,将其C#版的设计模式代码 ...

  8. POJ3013 Big Christmas Tree[转换 最短路]

    Big Christmas Tree Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 23387   Accepted: 5 ...

  9. luogu1151 亲戚

    题目背景 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系. 题目描述 规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚.如 ...

  10. Discuz! X2.5判断会员登录状态及外部调用注册登录框

    Discuz! X2.5判断会员登录状态及外部调用注册登录框 有关discuz论坛会员信息,收集的一些资料: 用dedecms+discuz做了个门户加论坛形式的网站,但是dedecms顶部目前只能q ...