面向对象

一,传统的面向过程

将要完成的工作,分为若干个步骤,然后按步骤一步一步完成,最终完成整个工作

二,面向对象

将要完成的工作拆分为一个一个对象的任务,每一个对象独立完成自己的任务,最终完成整个工作

三,面向对象的基本概念

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运算符进行克隆,会生成一个新的对象

原文地址:https://www.cnblogs.com/wfc139/p/9135231.html