面向对象的优点
- 可读性
- 可重用性
- 扩展性
- 稳定性
- 维护性
- 可测试性
面向对象的三大特性
封装:封装是把对象属性和成员方法,加上访问修饰符,使其尽可能隐藏对象的内部细节,以达到对成员的访问控制(是访问的控制,而不是拒绝访问)
继承
- 把两个类或者多个类中的相同的部分可以提出来,父类(基类),子类(派生类)画图的时候箭头指向的是父类
- 对于php来说是单继承的。只能继承一个父类,但是一个父类可以有很多个子类
多态
- 多态的思想:同一操作作用于不同的对象,会产生不同的执行效果
- 技术要求:必须有继承关系,父类最好是接口或者抽象类
构造方法与析构方法
1.构造方法(实例化对象使用)
- 是对象创建完成以后,第一个自动调用的方法
- 是给对象中的成员赋初始值使用的
2.析构方法
- 对象释放前自动调用的方法
- 析构方法没有参数
PHP中的3种访问修饰符
public(公有的,默认的)
private(私有的)
protected(受保护的)
- 子类使用extends继承父类,子类可以将父类的所有内容都继承过来
- private是私有的,只能自己用,别人不能用,包括子类也不能用
- protected受保护的权限,只能是自己和自己的子类中可以使用,不能在除了自己和子类的外面使用
- public是公开的权限。自己,子类,类外都可以使用
- 只要在声明成员属性或成员方法时,使用private关键字修饰,就实现了对成员的私有封装,封装后的成员在外部时不能直接访问的,只能在对象的内部方法中使用$this来访问
魔术方法
-
__set() 代替通用的set赋值方法,在直接设置私有属性时自动调用(该方法需要两个参数)
-
__get() 代替通用的get赋值方法,在直接访问私有成员属性的时候自动调用(该方法需要一个参数)
-
__isset() 是使用isset()方法判断一个私有属性是否存在时,自动调用__isset()魔术方法(参数是属性名称)
-
__unset() 是使用unset()方法删除一个私有属性的时候,自动调用__unset()魔术方法(参数是属性名称)
这四个魔术方法只对类中的私有属性或者是受保护的成员属性有效,魔术方法前的修饰符可以是公有的或私有的不影响调用 -
__tosreing()
①我们在调用echo、print、printf 输出一个对象引用时(或者说输出一个对象地址时)自动调用这个方法
②我们可以把对象的基本情况放到__tostring()内部,形成字符串返回
③__string()方法中,不能有参数,必须有返回值,返回值必须时字符串类型的 -
__clone()
①我们在使用clone关键字复制对象时自动调用的方法
②作用:对新克隆的对象进行初始化
③在这个魔术方法中的$this表示的时克隆之后的对象,也就是说代表的副本。 -
__call()
①在调用对象中不存在的方法时,自动调用的方法
②需要有两个参数。第一个参数是调用的那个不存在的方法的方法名;第二个参数是调用的那个不存在的方法的参数。
③作用:如果方法不存在,可以写提示信息
主要作用:可以将那些功能相似,但是方法名不同的方法采用这种方式来表示。
魔术方法的特点
- 魔术方法都以“__”开头
- 自动调用,不同的魔术方法有不同的调用时机
- 魔术方法的方法名都是固定的
- 如果没有写,那么魔术方法就不存在,也就不会有自动调用的功能了
————————————————————————————————————————————
重写
继承中的重写(覆盖)——在子类中可以写和父类同名的方法
在子类中定义的与父类中同名的属性是对父类属性的重写(覆盖)
在子类中定义的与父类中同名的方法是对父类方法的重写(覆盖)
在子类中访问父类的方法: 类名::成员 parent::成员
只要是子类的构造方法,去覆盖父类的构造方法,一定要在子类的构造方法的最上边调用一下父类被覆盖的构造方法
重写(覆盖)的时候权限问题:子类只能大于或等于父类的权限,不能变小;私有的不能覆盖,而是完全当作自己全新的。
PHP里面类名和方法名是不区分大小写的,但是变量名是区分大小写的
————————————————————————————————————————————
关键字
instanceof— 操作符 — 用于检测当前的对象是否属于某一个类的类型
final —在java里面final可以修饰常量
final
- final只可以修饰类和方法,修饰类 final class Person{}
- final修饰的类不能扩展,即不能有子类,也就是说这个类是最终的类
- 修饰方法:public final function say(){}
- final修饰的方法,不能在子类中被重写,即这个方法就是最终的方法
static
static 修饰属性和方法,不能修饰类
- static修饰的成员属性,存在于内存的初始化静态段
- 可以被所有同一类的多个对象共用
- 类在第一次出现的时候,就把该类的静态成员加载到了内存中
- self:: 指的是本类
- 静态成员一旦被加载,只有脚本结束才释放
- 在静态方法中,不能访问非静态的成员
const
const 修饰的成员属性为常量,const只能修饰成员属性(相当于这个属性是一个常量属性)
定义常量需要注意的几点
- 常量建议使用大写,不适用$
- 常量一定在声明的时候就给好了初值
- 常量只能读,不能修改
常量的访问方式
- 在类的外部 —— 类::常量名
- 在类的内部 —— self::常量名
单态(单例、单件)设计模式
java里面有23种设计模式,比如有单例模式、工厂模式、MVC模式
单态模式的主要作用就是保证在面向对象程序设计中,一个类只能有一个实例对象
如何保证让一个类只有一个对象
- 先让这个类不能创建对象,将构造方法变为private
- 在类的内部使用一个方法来创建对象,这个方法是静态的
抽象方法
- 定义:一个方法如果没有方法体,那么这个方法就是抽象方法
- 声明一个方法,不使用{},直接使用“;” 结束
- 如果是抽象方法,必须使用abstract关键字来修饰这个方法
抽象类
- 如果一个类中有抽象方法,那么这个类就是抽象类
- 如果是抽象类,必须使用abstract关键字来修饰这个类
抽象类和普通类的区别
- 抽象类是一种特殊的类,抽象类里面有抽象方法
- 抽象类不能实例化对象,也就是说抽象类不能创建出对象
抽象类的作用:抽象类是用来要求子类结构的,抽象类是一个规范
抽象方法的作用:抽象方法就是规定了子类必须有这个方法的规范,但是没有具体的实现,所以它交给子类来实现(重写)具体的功能(方法)
注意: 子类必须全部重写(覆盖)抽象方法,如果子类只部分重写抽象类的方法,那么说明子类里面还有抽象方法,也就是说这个子类也必须是抽象方法