php面向对象特征详解

一、面向过程和面向对象

面向对象是相对于面向过程的一种编程方式。

面向过程是一种以过程为中心的编程思想。这些都是以什么正在发生为主要目标进行编程,不同于面向对象的是谁在受影响。与面向对象明显的不同就是封装、继承、类。

面向对象是基于面向过程的一种编程方式。操作的是一个个具体的对象,比如你需要操作一个动物的移动,你需要先实例化那个动物的一个管理类对象,然后告诉这个“动物”的对象,需要移动到什么地方,然后动物就自己走过去了。至于具体是怎样走的,外部不关心,只有“物体”对象本身知道。

面向对象有优点也有缺点,也存在一些争论的地方。确实,面向对象在性能上面肯定不如面向过程好,毕竟面向对象需要实例化对象,需要消耗cpu和内存。但我觉得它的优点也是很明显的,毕竟在一个大型的项目里面,面向对象易于维护和管理,条理也清晰,是一种重要的编程思想。

 

二、面向对象的3大特征

面向对象有3大基本特征:封装、继承、多态。(以银行为例子说明)

1、封装:

对于一般人来说,银行的印象就只有一排对外办公的窗口,然后有存款和取款2种基本业务。

银行是一个结构非常复杂,功能非常众多的机构。但其实我们并不会很关心银行内部是怎样运作的,比如银行员工是怎样数钱的,怎样记录存款,怎样开保险柜,等等。这些对于外部的人员来说,知道了可能会引起更多不必要的麻烦。所以银行只需要告诉你,你可以在这个窗口办理业务,可以存款和取款,就够了。

所谓的封装,就是指把内部的实现隐藏起来,然后只暴露必要的方法让外部调用。

 

2、继承:

刚才提到了银行有2种最基本的业务,存款和取款。但现实中,大部分的银行都不止这两种业务,还有很多其他的业务,比如投资窗口、办理对公业务的窗口等等。但这些业务,都是基于银行的存款和取款两大基础业务上再添加的,所以我们可以理解成,基本的银行是只有2种业务的,然后后来的银行在保留了原有银行的业务基础上,再扩展了其他的业务。

如果把基本银行(总行)看做父类(基类),包含存款和取款2个公共方法,那么后来的银行(分行)可以看做是子类,它在继承了基本银行存取款的公共方法之后,还自己新增了投资一个公共方法。有些银行甚至会重写基本的存取款功能,让自己和基本银行的业务有一定的区别。这个过程,就是继承。

php代码例子:(注:子类不能访问基类的私有属性和私有方法)

//定义一个总行父类
class Bank{
	//存款方法
	public function deposit(){
		return "这是基础存款业务方法!";
	}

    //取款方法
	public function withdrawal(){
		return "这是基础取款业务方法!";
	}

}

//定义一个广州分行子类,并继承基类
class GZBank extends Bank{

    //基于父类再新增一个投资方法
    public function invest(){
        return "这是广州分行新增的投资业务方法!";
    }

}

//实例化子类,并继承父类
$guangzhou_bank = new GZBank;

//子类继承父类的存款业务方法
echo $guangzhou_bank->deposit();//输出 "这是基础存款业务方法!"

//子类新增的方法
echo $guangzhou_bank->invest();//输出 "这是广州分行新增的投资业务方法!"

3、多态:

同样是存款的业务,如果我拿着人民币和拿着美元去银行办理,实际上银行处理的方式是不一样的。这种办理同一种业务(公共方法),由于给予的内容(传入的参数类型或者数量)不一样,而导致操作(最终实现的方法)不一样,叫做编译多态,也叫做函数的重载。

接下来,我去了一家银行存款,我不知道这家银行的存款业务有没有和基本银行不一样,反正我就是把钱存进去了,然后具体业务的实现究竟是调用了基本银行存款功能,还是这家银行本身有新的存款功能实现,我是不关心的。这种外部直接调用一个方法接口,然后具体实现的内容由实际处理的类来决定使用基类或者子类的方法,就叫做运行时多态。

php代码例子:

class deposit{//定义存款客户父类
  protected function working(){//定义存款客户工作,需要在子类的实现
    echo "本方法需要在子类中重载!";
  }
}


//定义人民币存款客户类
class CNY_deposit extends deposit{
  public function working(){//实现继承的工作方法
    echo "开始人民币存款业务!";
  }
}

//定义港币存款客户类
class HKD_deposit extends deposit{ 
  public function working(){
    echo "开始港币存款业务!";
  }
}

//定义韩币存款客户类
class KRW_deposit extends deposit{ 
  public function working(){
    echo "开始韩币存款业务!";
  }
}


function printworking($obj){ //定义处理方法
  if($obj instanceof deposit){   //若是员工对象,则显示其工作状态
    $obj->working();
  }else{  //否则显示错误信息
    echo "Error: 对象错误!";
  }
}

printworking(new CNY_deposit());//"开始人民币存款业务!"
printworking(new HKD_deposit());//"开始港币存款业务!"
printworking(new KRW_deposit ());//"开始韩币存款业务!"

三、面向对象业务的参与角色和边界划分

除了几大特征以外,面向对象在使用的时候有几个概念:参与者、边界、业务主体、业务工人。

这几个概念好像很高端大气,但实际上归纳成一句话,就是“谁做什么,做到什么程度”。

比如“你去银行存钱”,参与人是你自己,业务主体是存钱,业务工人是银行职员,边界就是到存钱为止。

这里的确定边界是一个很重要的概念。面向对象操作的对象实际上是可大可小的,在不同的业务过程里面,参与者和业务的主体是可以改变的的。

还是存钱这件事情,参与者是你自己,但其实包含了一系列后续的操作。比如银行职员在拿到你的钱之后,需要用点钞机去数一下。这个“职员点钞”的过程,实际上是一个子业务,这个业务包含在存款的总业务里面,但是不需要客户去关心。这时候业务的参与者变成了银行职员,业务主体是点钞,业务工人变成了点钞机,业务的边界也只划分到点钞本身。

存款实际上是一个复杂的业务过程,又很多诸如点钞这样的子业务组成了一个大的存款业务,然后如果把存款和取款之类业务看成子业务,这些子业务又组成了银行这个复杂的总业务机构。如果把银行看成是子业务,和商场、市场、交通等子业务,共同的又组成了我们的生活这个更复杂的大业务,把每个人的生活看成是子业务,然后每个人的生活又组成了国家。如此类推,组成了地球、组成了宇宙,无穷无尽……

根据不同的业务边界的划分,我们得到了不同的范围和结果。每一个子的业务,是独立的,我们可以单独的修改它们。比如点钞这个操作,我们可以不用点钞机,改为用手点钞,也能达到同样的结果。再通过一个个子的对象,组合成庞大的复杂的系统。只要我们划分的边界足够的清晰和明确,就可以有条不紊的做各种复杂的功能。这正是面向对象为什么能容易维护和管理的原因。

四、面向对象的个人看法

按照统一建模语言的理论,其实在实际使用某种语言编写功能之前,应该是有设计阶段的。这个阶段只是弄清楚业务的参与者、边界、业务主体、业务工人等元素,然后归结成“谁做什么”。这个阶段,我们不需要知道是用什么编程语言来实现的,也许根本不需要计算机,用纯人工也能完成功能。

所以,当我自己需要完成某些功能货接口时候,都不要着急敲代码, 应该先拿笔在纸上面把流程初略画一遍,把结构搞清楚,把数据的流动过程模拟一下。把思路搞清晰之后,就可以简单的把类的结构写一下,把需要抽象的抽象,该提取的提取,再逐步完成具体代码实现。

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值