浅谈面向对象的基本概念

回顾面向过程

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

特点: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.类名后面不加括号(),这不是函数。

<?php
class 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();

//调用对象的一个成员属性nose
echo $wyl->nose;

//调用对象的一个成员属性hair
echo $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~+∞个

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

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

2.他是一个php关键词

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

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

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

<?php
class 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】验证:先构造的后析构。

<?php
class 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】验证:有多个类时,是否依然遵循“先构造的后析构”。

<?php
class 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值