本例是根据一本php教材里的面向对象编程练习小项目翻录而成,是面向对象的一个综合小练习。
本例虽然并不实用,却能够应用到大部分面向对象的语法知识,也可以让读者了解一些面向对象的开发思想,让读者更深入地掌握封装、继承和多态三大面向对象的重要特性。本节的图形计算器程序可以实现计算矩形、三角形及圆形的周长和面积。
文件:index.php
图形计算(使用面向对象技术开发) class="container">php //设置错误报告的级别,除了无关紧要的“注意”,其它所有报告都输出 error_reporting(E_ALL & ~E_NOTICE); //通过魔术方法 __autoload() 自动加载所需要的类文件,将需要的类包含进来 spl_autoload_register(function($className){ require_once(__DIR__ . '/' . strtolower($className) . '.class.php'); //包含类所在的文件 }); echo new Form("index.php"); //输出用户需要的表单 if(isset($_POST['sub'])){ echo new Result(); } ?> class="text-dark">图形(周长&面积)计算器
矩形 || 三角形 || 圆形
文件:form.class.php
php /** project:面向对象版图形计算器 file: form.class. php 在不同的图形时输出对应的表单射象,在主脚本程序中提供给用户一个操作界面 package:shape */ class Form{ private $action; // 表单类 Form 属性 action 的值,用于设置表单提交的位置 private $shape; // 用户选择形状的动作 /* 构造方法,用于对用户的操作动作和表单提交的位置进行初使化赋值 */ function __construct($action = ""){ $this->action = $action; //为表单类 Form 中的 action 属性赋值 /* 用户选择形状的动作,默认为矩形 rect */ $this->shape = isset($_GET ["action"] ) ? $_GET["action"] : 'rect'; } /* 魔术方法 __toString(),通过用户不同的请求,返回用户需要的表单字符串,在页面中显示 */ function __toString(){ $form = ''; return $form; //返回用户需要的输入形状表单界面 } /* 私有方法,用于获取矩形的表单输入 */ private function getRect(){ $input = '请输入「矩形」的宽度和高度:
'; $input .= '宽度:$_POST['width'] . '" class="form-control" />'; $input .= '高度:$_POST['height'] . '" class="form-control" />'; return $input; } /* 私有方法,用于获取三角形的表单输入 */ private function getTriangle(){ $input = '请输出「三角形」的三条边:
'; $input .= '第一边:$_POST["side1"] . '" class="form-control" />'; $input .= '第二边:$_POST["side2"] . '" class="form-control" />'; $input .= '第三边:$_POST["side3"] . '" class="form-control" />'; return $input; } /* 私有方法,用干获取圆形的表单输入 */ private function getCircle(){ $input = '请输入「圆形」的半径:
'; $input .= '半径:$_POST["radius"] . '" class="form-control" />'; return $input; } }
文件:shape.class.php
php /** project:面向对象版图形计算器 file:shape.cass.php 声明一个形状的抽象类,作为所有形状的父类,里面有两个抽象方法,根据子类的形状去实现 package:shape */ abstract class Shape{ public $shapeName; //形状的名称 abstract function area(); //声明的抽象方法在子类中实现它,用来计算不同图形的面积 abstract function perimeter(); //声明的抽象方法在子类中实现它,用来计算不同图形的周长 /** * 该方法是一个普通方法,用来对所有形状表单输入的值进行验证 * @param mixed $value 接收表单输入的值,对该值进行验证 * @param string $message 消息提示的前缀 * @return boolean 验正通过返回 true,失败则返 false */ protected function validate($value, $message = '输入的值'){ if($value == '' || !is_numeric($value) || $value < 0){ $message = $this->shapeName . $message; echo '' . $message . '必须为非负值的数宇,并且不能为空
'; }else{ return true; } } }
文件:result.class.php
php /** project:面向对象版图形计算器 file:result.class.php 声明一个 Result 结果类,通过多态的应用获取用户所选形状的计算结果 package: shape */ class Result { private $shape = null; // 成员属性用于获取某一形状对象 /* 构造方法用于初始化成员属性 $shape */ function __construct(){ /* 根据用户的 get 方法提交的动作 'action' 创建对应的形状对象[ $_GET['action']()变量函数技术 ] */ $this->shape = new $_GET['action'](); // 如:矩形,$this->shape = new Rect(); } /* 声明一个魔术方法 __toString,在直接访问该对象引用时自动调用,返回利用多态计算后的结果字符串 */ function __toString (){ // 调用形状对象中的周长方法,获得周长的值 $result = $this->shape->shapeName . '的周长:' . round($this->shape->perimeter(), 2). '
'; // 调用形状对象中的面积方法,获得面积的值 $result .= $this->shape->shapeName . '的面积:' . round($this->shape->area(), 2) . '
'; return $result; // 返回计算结果字符串 } }
文件:rect.class.php
php /** project:面向对象版图形计算器 file:rect.class.php 声明了一个矩形子类,根据矩形的特点实现了形状抽象类中的周长和面积方法 package: shape */ class Rect extends Shape{ private $width = 0; //声明矩形的成员属性宽度 private $height = 0; //声明矩形的成员属性高度 /* 矩形的构造方法,用表单 $_POST 接收的高度和宽度初始化矩形对象 */ function __construct(){ $this->shapeName = "矩形"; //为形状命名 //通过从 shape 中继承的方法 validate(),对矩形的宽度和高度进行验证 if($this->validate($_POST["width"], "宽度") && $this->validate($_POST["height"], "高度")){ $this->width = $_POST["width"]; //通过超全局数组 $_POST 将表单输入宽度给成员属性 width 赋初值 $this->height = $_POST["height"]; //通过超全局数组 $_POST 将表单输入高度给成员属性 height 赋初值 } } /* 按矩形面积的计算公式,实现抽象类 shape 中的抽象方法 area() */ function area(){ return $this->width * $this->height; // 访问该方法时,返回矩形的面积 } /* 按矩形周长的计算公式,实现抽象类 shape 中的抽象方法 perimeter() */ function perimeter(){ return 2 * ($this->width + $this->height); // 访问该方法的,返回矩形的周长 } }
文件:triangle.class.php
php /** project:面向对象版图形计算器 file:triangle.class.php 声明了一个三角形子类,根据三角形的特点实现了形状抽象类中的周长和面积方法 package: shape */ class Triangle extends Shape{ private $side1 = 0; // 声明三角形第一条边的成员属性 private $side2 = 0; // 声明三角形第二条边的成员属性 private $side3 = 0; // 声明三角形第三条边的成员属性 /* 三角形的构造方法,用表单 $_POST 中接收的三边值初始化三角形对象 */ function __construct(){ $this->shapeName = "三角形"; // 为形状命名 /* 通过从 shpe 中继承的方法 validate(),对三角形的三边进行验证 */ if($this->validate($_POST["side1"], "第一边") & $this->validate($_POST["side2"], "第二边") & $this->validate($_POST["side3"], "第三边")){ // 通过本类内部的私有方法 validateSum(),验证三角形的两边之和是否大于第三边 if($this->validateSum($_POST["side1"], $_POST["side2"], $_POST["side3"])){ $this->side1 = $_POST["side1"]; $this->side2 = $_POST["side2"]; $this->side3 = $_POST["side3"]; }else{ echo '三角形的两边之和要大于第三边
'; } } } /* 按三角形面积的计算公式(海伦公式),实现抽象类 shape 中的抽象方法 area() */ function area(){ $s = ($this->side1 + $this->side2 + $this->side3) / 2; // 返回三角形的面积 return sqrt( $s * ($s - $this->side1) * ($s - $this->side2) * ($s - $this->side3)); } /* 按三角形周长的计算公式,实现抽象类 shape 中的抽象方法 perimeter() */ function perimeter(){ return $this->side1 + $this->side2 + $this->side3; // 返回三角形的周长 } /* 本类内部声明一个私有方法 validate(),用于验证三角形的两边之和是否大于第三边 */ private function validateSum($s1, $s2, $s3){ // 如果三角形任意两边的和大于第三边则返间 true,否剩返间 false if( (($s1 + $s2) > $s3) && (($s1 + $s3) > $s2) && (($s2 + $s3) > $s1) ){ return true; }else{ return false; } } }
文件:circle.class.php
php /** project:面向对象版图形计算器 file:circle.class.php 声明了一个圆形子类,按圆形的特点实现了形状抽象类 Shape 中的周长和面积 package: shape */ class Circle extends Shape{ private $radius = 0; // 一个成员属性用于存储圆形的半径 /* 圆形的构造方法,用表单 $_POST 中接收的半径初始化圆形对象 */ function __construct(){ $this->shapeName = "圆形"; // 为形状命名 // 通过从 shape 中继的方法 validate(),对圆形的半夜进行验证 if( $this->validate($_POST["radius"], '半径') ){ $this->radius = $_POST["radius"]; } } /* 按圆形面积的计算公式,实现抽象类 shape 中的抽象方法 area() */ function area(){ return pi() * $this->radius * $this->radius; // 返回圆形的面积 } /* 按圆形周长的计算公式,实现抽象类 shape 中的抽象方法 perimeter() */ function perimeter(){ return 2 * pi() * $this->radius; //返回圆形的周长 } }
代码下载
效果图: