面向对象--php基础知识笔记

概念php

面向对象程序设计是一种程序设计范型,同时是一种程序开发方法。它将对象最为程序的基本单元,将程序和数据封装其中,以提升软件的重用性、灵活性、扩张性。面向对象的核心思想:对象、封装、可重用性和可扩展性。数据库

对象与数组关系编程

1) 对象转化为数组,数组也能转换成对象数组

2) 数组是由键值对数据组成的,数组的键值对和对象的属性/属性值对十分类似缓存

3) 对象和数组的区别在于,对象还有一个指针,指向它所属的类编辑器

类与对象的关系函数

1)类是定义了一系列的属性和操做的模板,而对象则把属性进行具体化,而后交给类处理优化

2)对象就是数据,对象自己不包含方法。可是对象有一个指针指向一个类,这个类里能够有方法spa

3)方法描述不一样属性所致使的不一样表现设计

4)类和对象是不可分割的,有对象就一定有一个类和其对应

魔术常量

__LINE__:文件中当前行号

__FILE__:文件的完整路径和文件名

__DIR__:文件所在的目录

__FUNCTION__:函数名称

__CLASS__:类的名称

__TRAIT__:Trait的名字(php5.4新加)

__METHOD__:类的方法名。返回该方法被定义时的名字(区分大小写)

__NAMESPACE__:当前命名空间的名称(区分大小写)

魔术方法

__construct:是一个构造方法,具备构造方法的类会在每次建立对象是先调用此方法,比较适合在使用对象以前作一些初始化工做。好比:属性赋值、数据库链接等

__destruct:是一个析构方法,会在某个对象的全部引用都被删除或者当对象被显示销毁时执行

__set__get:是php内置的方法,动态的建立类属性和方法。重载是指一个类中能够定义参数列表不一样但名字相同的多个方法

__call和__callStatic:当调用一个不可访问的方法(未定义或者不可见)时,__call

会被调用。 不只能够对方法进行动态的建立还能延迟绑定

__toString:echo打印对象体,对象就会自动调用它定义的__toString 方法,格式化输出这个对象所包含的数据

继承与多态

继承的优缺点:继承最大的有点是扩展简单,缺点:破坏封装性、紧耦合、使用不当可能违反现实世界的逻辑。

如何使用继承

1)精心设计专门用于被继承的类,继承的抽象层应该比较稳定,通常不要多余三层

2)对于不是专门用于被继承的类,禁止其被继承。使用final修饰符便可防止重要方法被非法覆写,又能给编辑器寻找优化的机会

3)优先考虑用组合关系提升代码的可重用性

4)子类是一种特殊的类型,而不仅是父类的一个角色

5)子类扩展,而不是覆盖或者使父类的功能失效

6)底层代码多用组合,顶层/业务层代码多用继承。底层组合能够提升效率,避免对象臃肿。顶层代码用继承能够提升灵活性,让业务使用更方便

多态的意义:实际开发中,只要关心一个接口或基类的编程,而不关心一个对象所属的具体类

多态总结

1)多态指同一类对象在运行时的具体化

2)php是弱类型语言,实现多态更简单、更灵活

3)类型转换不是多态

4)php中父类和子类存在继承关系,子类没法向上转型为父类,从而失去多态最典型的的特征

5)多态的本质是if else,实现的层级不一样

面向接口编程

接口概念

1)接口做为一种规范和契约存在。做为规范,接口应该保证可用性,做为契约,接口应该保证可控性

2)接口只有一个声明,一旦使用interface关键字,就应该实现它。接口自己什么都不作,它能够告诉咱们它能作什么

3)php接口存在两个不足,一是没有契约限制,而是缺乏足够多的内部接口

接口与抽象类之间的区别:

1)二者表达的概念不同。抽象类是一类事物的高度聚合,那么对于继承抽象类的子类来讲,对于抽象类来讲,属于“是”的关系;而接口是定义行为规范,所以对于实现接口的子类来讲,相对于接口来讲,是“行为须要按照接口来完成”

2)抽象类在定义类型方法的时候,能够给出方法的实现部分,也能够不给出;而对于接口来讲,其中所定义的方法都不能给出实现部分

3)继承类对于二者所涉及方法的实现是不一样的。继承类对于抽象类所定义的抽象方法,能够不用重写,也就是说,能够延用抽象类的方法;而对于接口类所定义的方法来讲,在实现类中必需要给出相应的方法实现

4)在抽象类中,新增一个方法的话,继承类中能够不用做任何处理;而对于接口来讲,则须要修改实现类,提供新定义的方法。 区别五,抽象类中能够定义属性,接口不可

反射

反射API的使用:

//实例化反射
$reflect = new ReflectionObject($object);

//获取对象属性列表
$props = $reflect->getProperties();

//获取对象方法列表
$methods = $reflect->getMethods();

class函数:

get_class($obj):获取对象属性列表所属的类

get_object_vars($obj):获取对象属性的关联数组

get_class_vars(get_class($obj)):类属性

get_calss_methods(get_class($obj)):返回由类的方法名组成的数组

反射的做用:善用反射能保持代码的优雅和简洁,但反射也会破坏类的封装性,由于反射可使本不该该暴露的方法或属性被强制暴露出来

面向对象设计的五大原则

单一职责原则(SRP)

含义:一个是避免相同的职责分散到不一样的类中,另外一个是避免一个类承担太多职责

优势:减小类之间的耦合、提升类的复用性

使用场景:数据库操做、缓存管理

接口隔离原则(ISP)

概述:代表客户端不该该强迫实现一些他们不会实现的接口,应该把胖接口中的方法分组,而后用多个接口代替它,每一个接口服务于一个子模块

如何遵照:

1)一个类对另一个的依赖性应当创建在最小的接口上(ISP能够达到不强迫客户依赖于他们不一样的方法,接口的实现类应该只呈现为单一职责的角色,ISP还能够下降客户之间的相互影响)

2)客户端程序不该该依赖它不须要的接口

开发-封闭原则(OCP)

基本思想:open模块的行为必须是开放的、支持扩展的,而不是僵化的;closed在对模块的功能进行扩展时,不该该影响或大规模的影响已有的程序模块。一个模块在扩张性方面应该是开放的而在更改性方面是封闭的

如何遵照:

1)在设计方面充分应用抽象和封装的思想。一方面要在软件系统中找出各类可能的可变因素,并封装;另外一方面,一种可变因素不该当散落在多个不一样的代码模块中,而应当被封装到一个对象中

2)在系统功能编程实现方面应用面向接口的编程,当需求发生变化时,能够提供该接口新的实现类,以求适应变化

替换原则(LSP)

概念:子类型必须可以替换掉他们的父类型,并出如今父类可以出现的任何地方

如何遵照:

1)父类的方法都要在子类中实现或者重写,而且派生类只实现其抽象类中的声明方法而不该当给出多余的方法定义或实现

2)在客户端程序中应该使用父类对象而不直接使用子类对象,这样能够实现运行期绑定

依赖倒置原则(DIP)

概念:父类不能依赖子类,他们都要依赖抽象类,抽象不依赖于具体,具体应该要依赖于抽象

如何遵照:

1)每一个较高层次都为它所须要的服务提出一个声明接口,较低层次类实现这个接口

2)每一个高层类都经过该抽象接口使用服务

相关文章
相关标签/搜索