浅谈面向对象的基本概念

来源:互联网 发布:照片变手绘软件 编辑:程序博客网 时间:2024/04/26 17:39

回顾面向过程

执行顺序:代码从上往下执行

特点:1.简单 2.性能高一些,执行速度快 3.代码多繁琐

面向对象 OOP

OOP: Object Oriented Programming 面向对象编程

OOA: Object Oriented Analysis 面向对象分析方法

OOD: Object Oriented Design 面向对象设计

面向对象包括(类和对象)

类: 对一组对象的定义,例如:人类,动物类。

对象: 所有具体的事物都是一个对象,包括自然界真实存在的一个具体的东西,也包括不存在的,例如:我的笔记本(单纯的笔记本还算是一个类,需要具体到是哪一个笔记本)、我的电脑。

面向对象:面向具体的事物就是面向对象。

面向对象特点/优势

1.执行效率低,相比较面向过程的代码而言

2.能更好的管理组织我们的代码(代码多,但不乱),可读性高。

3.代码能够更好的复用

4.结构很清晰

5.使用起来非常简单,写的时候很痛苦。

类的定义

1.通过class关键词声明一个类

2.命名规范:
①字母/数字/下划线;
②首字母大写;
③数字不能开头;
④不区分大小写但要严格注意大小写。

3.类名后面不加括号(),这不是函数。

<?phpclass Person{    #code}

【注意】

1.类定义完成之后,如果不实例化,是没有意义的,没有任何作用。

2.函数也是这样,只定义不使用没有意义。

【命名驼峰原则】

大驼峰:所有单词首字母大写,例如:WuYaLun

小驼峰:首字母小写,其他的单词首字母都大写,例如 wuYaLun

成员属性

【注】类的成员属性是静态的,例如人类的 姓名/身高/体重。

1.可以使用public来定义,可以不加,默认是public。

2.跟变量是一样的,用$来定义,可以有默认值,遵循小驼峰命名法。

成员方法

【注】类的成员方法是动态的,例如人类的说话/跑步/吃饭。

1.可以使用public来定义,可以不加,默认是public。

2.跟函数差不多,以小驼峰命名法来命名,不能以数字开头/支持下划线,严格区分大小写。

3.可以有形参,形参可以有默认值。

4.可以有返回值。

5.跟普通函数不一样的,不能直接使用,必须存在于类中,是属于类的成员方法。

<?php/*** Person 类*/class Person{    //成员属性    public $mouth;    public $nose = 'big';    public $hair = 'long';    public $height = 180;    //成员方法    public function treeNewBee ()    {        echo '我年薪20W';    }    public function cheDan($str = '没什么好扯的')    {      echo $str;    }    public function makeChild($who = '爱谁谁')    {      echo '和'.$who.'生孩子<br />';    }}//类的实例化(使用一个新的对象)$wyl = new Person();//调用对象的一个成员属性noseecho $wyl->nose;//调用对象的一个成员属性hairecho $wyl->hair;//调用对象的一个成员方法echo $wyl->makeChild();

【注意事项】

即使是在同一个类中实例化一个类,但对象仍然是唯一的。相等== 但不全等===

// 注意每实例化一个类/创建一个对象,对象都是唯一的。$a = new Person();$b = new Person();// $a 和 $b 相等== 但不全等===

类的使用及成员方法/成员属性的调用

1.类的使用(实例化一个类/创建一个对象):new关键词

2.调用成员属性:$var->成员属性名

3.调用成员方法:$var->成员方法名()

<?php// 定义了一个类  class Person{    public $name='wyl';    public function say()      {        echo 'I can say';      }  }// 使用这个类:实例化一个对象$wyl = new Person();// 调用成员属性,并用echo打印出来echo $wyl->$name;// 调用成员方法$wyl->say();

$this关键词

在类的内部通过成员方法来调用类的成员属性时,需要用$this关键词,this是指当前对象。

构造方法__construct()

个数:0~+∞个

参数:0~+∞个

//当实例化一个类的时候,率先执行构造方法__constructclass Person{    public function __construct()    {        #code    }}

1.构造方法是php类里面魔术方法的一种

2.他是一个php关键词

3.他在new一个对象的时候会被自动调用,即new之后率先执行构造方法

4.利用该特点,完成对象成员属性的值的初始化,来满足不同的对象在被new出来之后就有不同的值。

【测试1】当实例化对象的时候,率先执行构造方法__construct

<?phpclass Person{    //成员属性    public $name = 'wyl';    // 构造方法    public function __construct()    {        $this->name = 'alen';    }    // Person类中的say方法    public function say()    {        echo $this->name;    }}// 实例化一个类/创建一个对象$wyl = new Person();// 调用Person中的say方法$wyl->say();

【输出结果】

alen

【结果分析】

构造方法__construct()是修改了成员属性name的值;say方法是输出了成员属性name的值。由输出结果可知,先执行了__construct()构造方法将name的值变为了'alen',然后say方法输出。若先执行say方法,则输出应为'wyl'

析构方法__destruct()

个数:0~1个

参数:0个

当一个对象被销/程序执行结束的时候,对象会被自动回收,最鲜明的表现是:如果类里面设置了析构方法,那么会在销毁的时候执行。

class Person{    public function __destruct()    {        #code    }}

【原理】当整个程序快结束之前,迅速销毁内存,内存被销毁了之后就开始执行构造方法。

【应用场景】数据库关闭/关闭Word时提示保存的对话框/GD库的关闭

【注】先构造的后析构。【像入栈堆栈一样】

【测试1】验证:先构造的后析构。

<?phpclass Person{    //成员属性    public $name;    // 构造方法    public function __construct($name)    {        echo '我的名字叫'.($this->name = $name).'<br />';    }    // 析构方法    public function __destruct()    {        echo '再见'.($this->name).'<br />';    }}// 实例化第一个对象$wyl = new Person('1');// 实例化第二个对象$pig = new Person('2');

【输出结果】

我的名字叫1我的名字叫2再见2再见1

【结果分析】

实例化第一个对象$wyl时,自动触发__construct,对name赋值为1;实例化第二个对象$pig时,自动触发__construct,对name赋值为2;当实例化都完成了,程序要结束运行之前,触发__destruct。此时,后构造的对象$pig率先触发__destruct,输出'再见2',然后先构造的对象$wyl再触发__destruct,输出'再见1'

【测试2】验证:有多个类时,是否依然遵循“先构造的后析构”。

<?phpclass Person{    //成员属性    public $name;    // 构造方法    public function __construct($name)    {        echo '我的名字叫'.($this->name = $name).'<br />';    }    // 析构方法    public function __destruct()    {        echo '再见'.($this->name).'<br />';    }}// 实例化第一个对象$wyl = new Person('1');// 实例化第二个对象$pig = new Person('2');class Animal{    //成员属性    public $name;    // 构造方法    public function __construct($name)    {        echo '我的名字叫'.($this->name = $name).'<br />';    }    // 析构方法    public function __destruct()    {        echo '再见'.($this->name).'<br />';    }}// 实例化第一个对象$wyl1 = new Animal('3');// 实例化第二个对象$pig1 = new Animal('4');

【输出结果】

我的名字叫1我的名字叫2我的名字叫3我的名字叫4再见4再见3再见2再见1

【结果分析】

构造顺序:第1个类的第1个实例化==》第1个类的第2个实例化==》第2个类的第1个实例化==》第2个类的第2个实例化析构顺序:第2个类的第2个实例化==》第2个类的第1个实例化==》第1个类的第2个实例化==》第1个类的第1个实例化

面向对象的三大目标

1.封装:把一些功能通过类给组织起来,然后方便的进行调用

2.继承:跟继承遗产一样。

3.多态:PHP里面没有很明确的多态的表现(例如C+ 成员方法可以重名,通过参数不同来判断不同的成员方法)。

0 0