面向对象
XXOO Xue Xi Object Oritened
OOP
面向对象编程
OOA
面向对象的分析
OOI
面向对象的封装实现
OOB
面向对象的设计
关系
OOA -> OOD -> OOI
魔术方法
__get() 魔术方法
触发时机: 当你访问一个私有成员属性的时候会触发该函数。
参数: 必须设置一个形参。 访问的属性名
返回值: 可以返回一个值,也可以不返回。
注意: 为了安全考虑,在使用该方法时需要判断逻辑上是否允许返回值。
__set() 魔术方法
触发时机: 当设置一个私有成员属性的时候回触发该函数。
参数: 必须设置两个参数。 设置的属性名和值
返回: 不必要设置。
注意: 为了安全考虑,在使用该方法时需要判断逻辑上是否允许返回值。
__unset() 魔术方法
触发时机: 当对一个私有成员进行unset的情况下触发。
参数: 必须设置一个形参。 unset的属性名
返回: 不必要设置。
注意: 为了安全考虑,在使用该方法时需要判断逻辑上是否允许返回值。
__isset() 魔术方法
触发时机: 当对一个私有成员进行isset操作的情况下触发。
参数: 必须设置一个形参。 isset的属性名
返回: 必须有一个。
注意: 为了安全考虑,在使用该方法时需要判断逻辑上是否允许返回值。
__call() 魔术方法
触发时机: 访问一个不存在的方法的情况下触发。
参数: 必须有2个参数,方法名和实参列表数组
返回: 可以有可以没有。
注意: 一般不推荐以该方法声明方法,因为没有办法进行封装操作。
封装关键字
关键字 在类中 在子类中 在类外
public 可以 可以 可以
protected 可以 可以 不可以
private 可以 不可以 不可以
var 可以 可以 可以
注意:var 尽可以修饰成员属性不可以修饰成员方法,推荐使用public
继承特性
父类:被其他类继承的类称之为父类。(基类)
子类:继承其他类的类称之为子类。(派生类)
继承格式:
class 子类名 extends 父类名{
//声明子类独有的成员属性和方法
//重载父类的成员属性值和方法
}
继承的特征:
1.如果子类继承了父类,则具备父类中所有的成员。
2.子类可以声明子类独有的成员属性和方法
3.子类中可以重新声明父类中的方法,用于重载父类方法的功能。
4.子类的封装级别必须大于等于父类的封装级别。否则出现等级错误!
对象的串行化
对象串行化的作用就是讲对象变为可以存储传输的字符串格式。
串行化操作:
对象字符串 = serialize(对象变量)
反串行化操作:
对象变量 = unserialize(对象字符串);
注意:进行对象反串行化操作时需要包含原有对象的类,否则有系统分配类创建。
__sleep() 魔术方法
触发时机:在对象进行串行化操作的时候触发。
参数:不需要
返回值:看情况决定,返回一个数组,数组中的成员决定将什么属性进行串行化。
注意:可以不写返回值,如果这样,看功能需求。
__wakeup() 魔术方法
触发时机:在对象进行反串行化操作的时候触发
参数:不需要
返回值:不需要。
注意:没有
final关键字
第一种用法(方法)
可以在声明方法的时候在前面添加的关键字,一旦添加了final关键字,则该方法不可以在子类中进行重载。
class 类名{
//方法
final public function 方法名(){
//此方法添加了final关键字不可以重载操作
}
}
注意:封装关键字和final关键字之间互不冲突!所以可以同时在一个方法上存在。
第二种用法(类)
可以在声明类的时候在class前添加关键字,一旦类添加了final关键字,则该类不可以被继承。
final class 类名{
//此类不可以被继承
}
const关键字
在类中成员属性不仅有变量类型,也可以声明常量类型,声明常量需要使用const关键字
格式 class 类名{
//定义常量
const 常量名=值;
}
访问:
类外访问方式:
类名::常量名 类外仅此一种访问方式。
类中访问方式:
类名::常量名
self::常量名 表示访问当前类的常量
parent::常量名 表示当前类的父类的常量
注意:常量归类所有而不属于任何一个对象。
static 关键字
在类中使用用于声明某个成员(包括属性和方法)归类所有而非归对象所有。
格式:
class 类名{
//成员属性
//声明和静态成员属性
static 封装关键字 $变量 = 值;
//非静态成员属性
封装关键字 $变量 = 值;
封装关键字 $变量 = 值;
//成员方法
//声明和静态成员方法
static 封装关键字 function 函数名(){
//绝对不可以出现任何的动态内容 (就是$this)
}
//非静态成员方法
封装关键字 function 函数名(){
}
封装关键字 function 函数名(){
}
}
访问方式:
类中
self::静态成员属性名
self::静态成员方法名()
类外
类名::静态成员属性名
类名::静态成员方法名()
对象名->静态成员方法名()
注意:一旦成员声明为静态,则不归任何对象所有,而归类所有。可以改变值,这是和常量的区别。声明静态方法时,方法内不可以有任何非静态内容。
instanceof运算符
检测某个对象实例是否有指定的类实例化而来。,
格式:
结果变量 = 对象 instanceof 类名字符串
注意:该运算符的功能和函数中的is_a() 效果一致。
如果对象属于该类或该类是此对象的父类则返回 TRUE
__toString() 魔术方法
触发时机:在echo 一个对象的时候自动触发。
参数:不需要
返回值:必须是一个字符串类型。
注意:返回值处不会进行自动类型转换,必须返回字符串或者强制转换类型。
clone关键字
克隆操作就是通过一个对象来获取另外一个新的对象的过程。
格式: 新对象变量 = clone 对象变量
__clone() 魔术方法
触发时机:在进行对象clone操作时触发。
参数:不需要
返回值:不需要。
注意:一般用于克隆对象时自动改变属性值。
注意:在对象中所有的对象赋值操作默认都是引用赋值方式。
设计模式
是一种编程经验的基类。
单例设计模式、MVC设计模式、观察者模式.....
单例设计模式:
原理:先禁止实例化对象,然后在类中开一个后门(静态方法),在后门方法中实例化对象,同时在该方法中还要检测是否已经实例化过
class 类名 {
//静态成员属性
static private $obj=null;
//私有化构造方法 禁止使用new运算符
private function __construct(){
}
//静态方法中实例化对象
static function createObj(){
//判断是否已经实例化过对象
if(self::$obj){ //已经实例化
return self::$obj;//返回原有对象
}else{//未实例化
self::$obj = new 类名;
retrurn self::$obj;
}
}
}
类的自动加载操作__autoload()
__autoload() 这是一个可以实现了类自动加载的函数,而不是一个方法。
注意:当页面需要使用一个类,而当前页面中又不存在这个类的时候回自动触发__autoload() 方法
function __autoload(接收类名的变量){
//一般使用include 语句进行类文件的包含
}
触发时机:当需要一个类,而页面又不存在这个类时触发。
参数:有一个 接收类名的变量
返回值:没有
MVC设计模式
M:Model ->模型
V:View ->视图
C:controller->控制器
注意:在使用MVC设计模式访问的过程当中 m表示模块(控制器类) a表示操作(方法)
抽象类
抽象类就是一个没有完全完成的类。属于一个半成品类。
抽象方法:没有具体方法体的方法就是抽象方法。
抽象类:包含抽象方法的类就是抽象类。
格式:
abstract class 类名{
//成员属性随便添加
function 方法名(参数...){
//完整的方法
}
//抽象方法
abstract function 方法名(参数...);
//抽象方法
abstract function 方法名(参数...);
}
注意:
- 声明抽象方法和抽象类使用abstract关键字。
- 具有抽象方法的类必须声明为抽象类,否则会报错。
- 抽象方法不能具有任何的方法体,但是可以具有参数。
- 抽象方法不可以直接使用,必须继承之后完善了所有抽象方法之后才可以使用。
- 抽象方法在继承之后如果抽象方法中包含参数,则实现时必须设置参数。
接口
抽象的不能再抽象的类就是接口。
接口的作用具有抽象类的作用,就是定义规则。
接口主要用于实现多继承操作。
定义接口:
interface 接口名{
//接口中只能定义常量属性
const 常量名 =值;
//定义方法
function 方法名();
function 方法名();
function 方法名();
}
注意:
- 定义接口需要使用interface 而不是class 。
- 接口中包含的所有方法都必须是抽象方法,存在非抽象方法会报错
- 定义接口中抽象方法时不需要使用abstract关键字,因为本来都是抽象。
- 定义接口中不能包含正常的成员属性,尽可以定义常量
- 接口不可以直接使用,必须有其他类继承之后完全实现所有抽象方法才可以使用。
- 接口可以继承多个,使用implements关键字继承,多个接口之间使用逗号分隔
多态
多态:就是多种状态,指的是一个对象能够用同一个方法可以实现不同的结果。
1002



被折叠的 条评论
为什么被折叠?



