PHP的面向对象简说
面相对象中的最重要的2个概念
类:(类是一种思想上的或者未实现的东西)
所有描述事物的概念就是类,所有事物的操作流程也是一个类
对象:
所有事物的操作流程的实施过程就是一个对象
类和对象的组成成分:
一种是用于对特征的描述 成员属性
一种是对其功能的描述 成员方法
类的书写规则
1.文件名
a) 函数的文件名 xxx.func.php
b) 类的文件名 xxx.class.php(单类文件)
类的文件名一般与类名相同
类的驼峰命名法:每个单词的首字母大写
2.类的书写规则
类必须有class关键字开始
Class关键字之后跟类名,类名通常和文件名相同
类名之后直接跟{}即可
3.成员属性的书写规则
声明成员属性必须使用关键字 var或者public private等.
声明成员属性可以赋值,可以不赋值
声明成员属性是,不能赋一个函数
成员属性的最大作用为成员方法提供一个桥梁的作用
4.成员方法的书写规则(同函数)
声明成员方法是需要使用function关键字
声明成员方法可以传入参数,也可以不传入参数
声明成员方法,方法允许存在返回值
类中只能出现成员属性和成员方法,不允许出现其他代码否则会有语法错误
对象的生成和使用方法
一般情况下,类是无法直接使用的,需要将类实例化成对象之后才可以使用。
实例化对象的方法:
变量= new 类名;
或者
变量 = new 类名();
使用对象的成员属性
对象变量->成员属性名
使用对象的成员方法
对象变量->成员方法名()
$this 关键字
在当前对象中的成员方法中调用当前对象中的成员属性
$this->表示当前对象
如果代码中具有$this->那么该类必须实例化才能使用
使用方法
$this->属性名
魔术方法: 一种特殊的函数
1.构造方法:__construct()或者类名相同
触发时机:在对象实例化的时候自动触发
作用: 初始化成员属性
参数: 可以有,可以没有 取决于设定和逻辑
返回值;没有
注意:如果构造方法具有参数,且参数没有默认值,在实例化是必须在类名()内添加对应的实参值;
2.析构方法:__destruct()
触发时机:在销毁对象的时候自动触发(unset或者页面执行完毕)
作用: 回收对象使用过程中的资源
参数: 没有
返回值;没有
面向对象的三大特征:
封装,继承 和多态
封装特性:在一个对象产生之后,对象的部分成员属性和成员方法逻辑上是不允许在对象外部进行调用或者使用的,这就是封装的特性
封装关键字 private 私有的
Private的特征:
1.被private修饰的成员属性不能够在类的外部访问,可以在类的内部访问
2.被private修饰的成员方法也不能在类的外部访问
3.Var 和private只能选取一个(还包括public 和protected)
魔术方法3:__get()
触发时机:访问私有成员属性的时候自动触发
作用:1.防止报错 2.为私有的成员属性访问提供后门
参数: 1个 访问私有的成员属性名称
返回值:可以有也可以没有
魔术方法4:__set()
触发时机: 对私有成员属性进行设置值的时候自动触发
作用:1.屏蔽错误 2.为私有成员属性设置值
参数:2个 1.私有成员属性名 2.要设置的值
返回值:无
魔术方法5:__isset()
触发时机: 对私有的成员属性进行isset检测时自动触发
作用:代替外部的isset检测 返回结果
参数:1个 1.私有成员属性名
返回值:有 一般返回isset(属性)结果
魔术方法6:__unset()
触发时机:对私有的成员属性进行unset操作时自动触发
作用: 代替外部的unset删除
参数:1个 1.私有的成员属性名
返回值:无
封装的三个关键字:
Private : 私有化封装
Protected: 受保护封装
Public 公共的封装1
2
3
4关键字/位置 类外 子类 类内
Private(私有) × × √
Protected(保密) × √ √
Public(共有) √ √ √
继承特性:
继承的格式:1
2
3Class 类名 extends 父类名{
//子类独有的属性和方法
}
概念
父类:被其他类继承的类就是父类 也叫做基类
子类:继承其他类的类就是子类也叫派生类
父类私有的属性 和方法 子类是不能继承
Php继承特点和其他语言的不同:
Php 语言是单继承
其他语言是多继承
继承的特点:
1.子类继承父类具有父类的所有成员属性和成员方法(私有的除外)
2.子类继承父类之后可以具有子类独有的属性和方法
3.在继承时,子类中允许出现和父类同名的方法,这种情况不冲突,而是子类的方法会覆盖父类的方法,这种方法叫做重载
4.魔术方法也可以被子类继承
5.如果父类具有构造方法,子类也具有需要构造方法进行构造的成员属性,此时需要在子类中重载父类的构造方法,并且在构造方法中使用parent::__construct() (也可以使用类名代替parent不推荐)进行调用父类的构造方法,构造继承而来的父类的成员属性
6.继承代码的时候不要瞎继承,人类不要继承猫类 不会变成猫人````
属性的重载
Public修饰的属性如果在子类有同名的属性会被重写
不管写在父类还是子类的方法访问这个属性都是被重载之后的值
Protected 父类中 如果是protected修饰属性 或方法 子类只能是protected或者public
Private 父类修饰的属性 那么太就有讲究了
权限关系
Private 1
Protected 2
Public 3
权限可以扩大不能缩小
Final 关键字
Final 意思 最后的 最终的
作用
1.修饰成员方法 禁止子类在重载父类的方法
2.用来修饰类 被final 修饰的类无法被继承
Const 关键字
作用:用于在类中声明常量,这个常量是类中的常量
类中的常量不归对象所有,而是归类所有(你有类声明常量是类的不是对象的)
在类中声明常量const
声明常量时需要给常量赋值
声明常量归类所有不是归任何对象所有
类中常量的访问方式
a) 类外部
类名::常量名
b) 类内部
类名::常量名
Self::常量名
Self表示当前类 $this->表示当前对象
Static 关键字
在类中使用static 声明的成员属性都是静态成员属性 声明的成员方法都是静态的成员方法
静态的成员特征是:不归对象所有,而是归类所有
1.static关键字及可以修饰成员属性也可以修饰成员方法
2.Static 声明的成员都是归类所有,而不是归对象所有在没有对象的情况下,可以通过类来访问
3.能声明静态的成员就需要声明静态的成员 效率高~~~
4.具有动态的成员方法不可以声明为静态的成员方法(没有$this)
5.如果方法中没有$this存在,那么这个方法实际上已经是静态的方法(版本>5.3请你写上static关键字)
静态的成员访问
类内部
类名::$静态的成员属性名
Self::$静态的成员属性名
类名::静态的成员方法名();
Self::静态的成员方法名();
类外部
类名::$静态的成员属性名;
类名::静态成员方法名();
对象->静态的成员方法名();(一般不用)
对象的串行化
将对象编程一个字符串的过程就是兑现高度串行化
作用:1.方便长久的保存对象,2方便在网络上传输
串行化操作:变量 = serialize(对象变量)
反串行化操作:
对象变量 = unserialize(变量)
魔术方法7:__sleep()
触发时机:在对象进行串行化操作的时候自动触发
功能; 执行需要串行化的成员属性
参数: 无
返回值:需要返回一个数组类型,每个元素都是要串行化的成员属性名
魔术方法 8:__wakeup()
触发时机:在对象进行反串行化操作的时候自动触发
功能;反串行化的时候自动修改部分成员属性值
参数: 无
返回值:无
魔术方法 9:__toString()
触发时机:在一个对象进行echo 操作的时候自动触发
功能;简化操作或者为对象输出值
参数: 无
返回值:必须有且必须为字符串类型
魔术方法10:__clone()
触发时机:对对象进行克隆操作的时候自动触发
功能;修改克隆之后的对象的部分属性值
参数: 无
返回值:无
注意:对象的赋值默认就是引用赋值,不能通过赋值操作获取一个新的对象,获取新的对象的操作应该使用克隆操作
格式:变量=clone 对象变量
魔术方法11__call()
触发时机:调用了类中不存在的方法时自动触发
功能;1.屏蔽错误2.为不存在的方法定义一个功能
参数: 2个 1.不存在的方法名 2.所有实参组成的数组
返回值:可有可无(根据实际功能决定)
魔术方法 12__autoload();
触发时机:当页面需要加载一个类而该类不存在时自动触发
功能;实现类的自动加载
参数: 1个 1.不存在类的类名
返回值:没有
##抽象类
具有抽象方法的类就是抽象类
抽象方法:
没有方法体的方法就是抽象方法
作用:领导用的~~协同工作 制定标准
特征:
1.抽象方法就是没有方法体的方法,方法体相当于函数体,抽象方法前面必须使用abstract关键字 且方法后不能写{} 但是要写;
2.如果类中有抽象方法,那么这个类前面必须使用abstract关键字修饰
3.抽象类中可以具有非抽象方法
4.抽象方法可以具有参数,要实现抽象方法必须传入同样的参数
5.抽象类不能直接使用 必须由其他类继承 并且全部实现所有的抽象方法才可以使用,抽象类的主要是给其他类进行继承操作的
6.抽象类可以继承抽象类
7.在抽象类中抽象方法不可以使用private关键字
接口:
如果一个类中没有任何的非抽象方法,且不存在除常量以外的任何成员属性,那么这个类就是一个接口
特征:
1.声明一个接口不使用class关键字 而是用interface 关键字
2.接口中的抽象方法不需要写abstract关键字 虽然他是抽象类
3.接口可以使用public 关键字 不可以使用protected或者private关键字
4.接口不允许有任何的成员属性,除了常量。
5.接口的继承不使用extends 而使用implements 关键字
6.extends 只能继承一个普通类或者一个抽象类,而implements可以同时继承多个接口,从而模拟多继承
面向对象三大特性 封装 继承 多态
另:附上一张思维导图
本文出自 “小风博客” BY:小风 如果你喜欢,转载请务必保留此出处^_^
小风博客 http://www.xfphp.cn 小风网络 http://www.hotxf.com