初识面向对象
引言
大家都在说编程中一定要使用面向对象,但是我一直不太懂面向对象到底是个啥玩意?经过我不懈努力的研究,我终于简单的明白了面向对象的是个啥玩意。
面向对象是一种编程思想,这种编程思想一旦掌握,对开发都有巨大的好处。再说面向对象之前,我们先来看下面向过程是啥
面向过程
啥叫面向过程捏,面向过程就是根据具体需求,写具体的代码。
举个荔枝
计算50+33的值
$sum = 50 + 33; echo $sum;
上述例子就是一个简单的面向过程的荔枝,它的优点 :能根据具体需求,快速写出具体代码;性能能比面向对象高;但是缺点也非常明显:功能单一化,难以扩展,无法复用,不利于维护;
所以说面向过程的编程思想仅限于具体、简单且将来不会有进行扩展或者维护需求的代码开发。
面向对象
说完了面向过程,那咱现在说一说面向对象。刚才说了那么多面向过程的优缺点,但是面向过程编程思想的缺点大于优点。既然有面向对象这种编程思想,本着存在即合理的看法,那想必面向对象肯定比面向过程好很多吧。
那么面向对象编程思想到底是个啥呢。这个我恐怕一时半会说不清楚。咱们直接上代码
继续那个计算50+33的值荔枝
第一步 说要求50+33的值是多少,那想必这肯定是一个在计算器中进行计算的,所以我们第一步就是要创建一个计算器类,创建这个类之前,需要想一想有哪些成员属性,有哪些成员方法等,在这个计算器类中存在着两个私有属性的数字变量和获取和设置这两个变量的成员方法和计算这两个变量指的计算方法
class calculator { // get|set // private $num1; private $num1; private $num2; // 计算方法 public function computer($strOperate) { /** * 如果我们需要的这个计算的值,不固定随便改,随便传入 * 并且还有内容设置 1 》 100 * @var integer */ // $num1 = 50; // 第一个值起作用 $this->setNum1(50); $this->setNum2(533); $strResult = ""; switch ($strOperate) { case '+': // 加法操作的参数有要求 // 只允许1 到 100 计算范围 if ($this->num1) { // code... } else { // code... } // 代码最精简 100多行 $strResult = $this->num1 + $this->num2; if ($this->num1) { // code... } else { // code... } // $strResult小于 0 不允许返回 0 break; case '-': $strResult = $this->num1 - $this->num2; break; case '*': $strResult = $this->num1 * $this->num2; break; case '/': $strResult = $this->num1 / $this->num2; break; } } // 创建四个方法 分别是 加法.... // 设置$num1值 public function setNum1($num1='') { if($num1 > 100 and $num1< 999){ $this->num1 = $num1; } else{ $this->num1 = 0; } // if ($num1 > 100 and $num1< 999) { // return $num1; // } else { // return 0; // } } public function getNum1() { return $this->num1; } public function getNum2() { return $this->num2; } public function setNum2($num2='') { if ($num2 < 0) { $this->num2 = $num2; } $this->num2 = 0; } }
第二步 创建一个客户端类,这个类主要就是做写入数据和计算符号,并获得相关结果
//引入计算器类文件 require 'Calcuate.php' class Client {
public function index()
{ $calcuate = new Calcuate(); $calcuate->setNumA(50); $calcuate->setNumB(33); return $calcuate->compute('+');
} }
从上述荔枝可以看出,面向对象优点是扩展性好,复用率高,维护方便,代码超少,但是缺点就是该编程思想过于抽象,不太好掌握
那么怎样才能拥有面向对象的编程思想呢?下图就是实现面向对象编程思想的思路
1.先通过面向过程实现相关业务
2.在思考创建相关业务共同的相同的地方并且创建这样一个类
3.思考这个类中有哪些成员属性和成员方法
4.思考基于这个类与其他类之间的关系,主要指的是对象与对象之间的关系
5.实例化并调用该类中的属性或者方法即可;
优化重构
从上述荔枝中可以看出,虽然已经基于面向对象的编程思想实现相关代码,但是相关类还略显臃肿。若要进行扩展和维护也是比较难的,所以我们需要重构,为将来的扩展和维护做好准备。
abstract class Operate { protected $numA; protected $numB;
public function setNumA($num) { $this->numA = $num; } public function setNumB($num) { $this->numB = $num; } public function getNumA() { return $this->numA; } public function getNumB() { return $this->numB; } //抽象方法创建的原则 : 1.子类共用 2. 子类一定会重写 abstract public function compute(); }
class Sum extends Operate { public function compute() { return $this->numA + $this->numB; } }
class Div extends Operate { public function compute() { return $this->numA / $this->numB; } }
class Mul extends Operate { public function compute() { return $this->numA * $this->numB; } }
// 减法类 class OperationSub extends Operation { ## 实现父类的计算方法 public function GEtResult() { $result = $this->numA - $this->numB; return $result; } }
// 简单运算工厂类 class OperationFactory { ## 根据需求创建对应的工厂类 public static function createOperate($operate) { $oper = null; switch ($operate) { case '+': $oper = new OperationAdd(); break; case '-': $oper = new OperationSub(); break; case '*': $oper = new OperationMul(); break; case '/': $oper = new OperationDiv(); break; } return $oper; } }
// 客服端 class Client { public function index() { $numA = $_POST["numA"]; $numB = $_POST["numB"]; $strOperate = $_POST["strOperate"]; ## 创建对应的计算类 $oper = OperationFactory::createOperate($strOperate); $oper->setNumA($numA); $oper->setNumB($numB); $strResult = $oper->GEtResult(); echo "结果是".$strResult; } }