面向对象
一,传统的面向过程
将要完成的工作,分为若干个步骤,然后按步骤一步一步完成,最终完成整个工作
二,面向对象
将要完成的工作拆分为一个一个对象的任务,每一个对象独立完成自己的任务,最终完成整个工作
三,面向对象的基本概念
1,类与对象
类:用于描述某一些具有共同特征的物体的概念,是某一类物体的总称 例如:人类
一个类所具有的共同特征包括2个方面的信息:属性和方法
对象:指一个具体的物体,该物体隶属于某个类 例如:张三这个人 就属于人类
对象属于类,没有类就不能有对象
<?php //定义一个类 class person{//类中的属性(就是变量) var $name = '张三'; var $sex = '男'; var $age = '22'; //类中的方法(就是函数) function personFun(){ echo '函数输出'; } //类中有一些常量(类常量) const PI = 3.14; }
可见类就是将一些变量和一些函数及一些常量用一个名字(类名)包起来的集合体,这些属性(变量),函数和常量隶属于该类,并且只能由该类及其创建出来的对象来使用
2,面向对象的语法
a,定义类:定义属性(变量) 定义方法(函数) 定义常量(类常量)
b,创建类的对象:$person1 = new person();person是上面代码的类名,此时$person1就是一个对象
c,使用对象
使用其属性:属性就是变量,也就是使用其变量
使用其方法:使用其函数
使用其常量
<?php //定义一个类 class person{
//类中的属性(就是变量) var $name = ''; var $sex = ''; var $age = ''; //类中的方法(就是函数) function personFun(){ echo '姓名:'.$this->name.'<br/>性别:'.$this->sex.'<br/>年龄:'.$this->age; } //类中有一些常量(类常量) const PI = 3.14; } $person1 = new person(); $person1->name = '张三'; $person1->sex= '男'; $person1->age= '22'; $person1->personFun();
输出结果:
四,创建对象的基本形式
方式一,$对象名 = new 类名(); 例如:$person1 = new person();
方式二:可变类名:
例如上面的代码:$people = 'person'; $person2 = new $people();
其中:方式以中的$person1和方式二中的$person2是一样的效果
方式三,$对象名 = new self; self指类本身,该方法只能在类内部方法中使用
方式四:通过对象创建对象$person1 = new person(); $person3 = new $person1;
五,对象的传值(默认是值传递)
值传递
引用传递
五,类中的成员
属性 方法 类常量
1.一般属性
属性就是放在一个类中的变量
定义形式:
形式一: var $v;//定义不赋值
形式二:var $v = 2;//定义并赋值,该值只能是一个直接量(常量),该值不能是计算表达式 或是变量
形式三:public $v;
形式四:public $v = 2;//var是public的别名,正式用public更好
2,一般方法
a,方法的定义和php中的方法定义是一样的
方法前面可以加修饰符:public protected private,省略不写时默认为public
b,方法中的$this关键字
$this是一个伪对象,代表当前所属类的当前对象
总结:类是定义好的某些对象的模型
对象是根据模型所创建出来的具体物体,一个对象有哪些属性(数据),是由该类来决定的,一个对象可以做那些事情(方法),也是由该类决定的
c,一个系统函数get_class(对象)
作用:获取某个对象的所属类型 结果是一个类名字符串
六,静态属性
定义静态属性时,前面要加关键字static
静态属性和一般属性的差别:一般属性属于该类的某个具体对象,每个对象的属性的值不一定相同
静态属性属于类本身,其实他就是该类所有对象的共有数据
1,静态属性语法 类名::$静态属性名;
七,静态属性
方法前面加static
语法:类名::静态方法名();
如果通过类名来调用静态方法,方法中不能出现$this,即$this在静态方法中不能使用
静态方法中不能调用非静态方法
self:代表当前类:只能在某个类的某个方法内部使用
八,构造方法 构造方法是“创建”对象的时候会自动调用。
构造方法是类中的一个特殊方法,其作用是在实例化一个对象的同时,给对象的属性赋值,使之一创建完成,就具有了本身的特有数据(构造方法本身就存在类中)
1.构造方法名和类名相同(php4版),php5版的构造方法名和类名可以相同,也可以是__construct()
2.构造方法没有返回值
3.构造方法的主要作用是完成对新对象的初始化,并不是创建对象本身
4.一个类有且只有一个构造方法,在php5后虽然__construct()和类名()可以共存,但实际只能使用一个
5.如果没有给类自定义构造方法时,则该类使用系统默认的构造方法
6,如果一个类中定义了构造方法,则实例化该类是就会调用该方法,且实例化时的参数要跟构造方法的参数一致
7.构造方法的默认修饰符为public
九,析构方法 析构方法是“销毁”对象的时候会自动调用。
语法:function __destruct(){}
显示销毁:①使用unset(对象名)
②$对象名 = null;
③$对象名 = 'abc';
隐藏销毁:程序执行完毕后,这个对象被系统销毁
通常是在销毁对象时,来清理数据
析构方法通常不需要去定义
析构方法不能调用
析构方法不能有形参
析构方法中可以用于清理一些在php代码结束后不能清理的数据,如生成的文件。
十,类的继承
某个类A具有的特征,另一个类B,具有A类所有特征,并且还具有自己的特征,这样B类继承了A类
语法:class A{}
class B extends A{}
十一,访问修饰符
public:公共的 protected:受保护的 private:私有的
public:用该修饰符的成员可以在任何位置访问,某个类的内部,某个类的具有继承关系的子类内部,某个类的外部
protected:在当前类或具有继承关系的上下级的类中访问
private:只能在所在类中访问
十二,重写 override
就是将父类继承下来的属性或方法重新定义
基本要求:下级的访问权限应不低于上级的访问权限
上级:public 下级:public
上级:protected 下级:protected,public
上级:private 下级:private protected,public
私有属性和私有方法的重写问题:私有属性和方法不能覆盖,但其实子类可以定义跟父类私有的同名属性和方法,只是当作自己的的新的属性和方法来看待,方法的参数必须一致
构造方法的重写:构造方法重写时参数可以和父类不一致
最终类 final class
如果希望某个类不被继承,则将其声明为最终类:final class 类名{}
最终方法:final method
一个方法,可以被下级类进行重写,如果这个方法不希望被下级类覆盖,则将其声明为最终方法:final function 方法名(){}
十三,设计模式
所谓设计模式就是解决一些问题的做法,是一种认为较好的经验总结.面对不同的问题,可能会有不同的解决方法,此时可以称为不同的设计模式
1.工厂模式
在实际应用中我们总是需要实例化很多类以得到对象
我们可以设计出一个工厂(其实就是类),该工厂的作用就是为人们生产各种对象.这种工厂只要指定类名,就可以获取一个该类的对象
class factory{ static function getInstance($className){ $obj = new $className(); return $obj; } } $obj1 = factory::getInstance('A');//获取类A的一个对象 $obj2 = factory::getInstance('B');//获取类B的一个对象
2.单例模式
需求:对于某些类,在使用他的时候,从头到尾(程序运行开始到结束),都只需要一个对象,就可以完成所有任务
单例:某个类,只允许创建出一个对象,即使去进行多彩创建,也只能得到一个对象
例如:$obj1 = new A();
$obj2 = $obj1;// 此时$obj2指向了跟$obj1同样的对象
$obj3 = new A();//此时$obj3是另外一个新的对象
在php 中一个对象可以使用clone运算符进行克隆,会生成一个新的对象