您所在的位置:小祥子 » 编程 » PHP » 正文

使用面向对象的图形计算器

时间:2015-06-15 编辑:rancho945 来源:本站整理

这个例子可能并不实用,但基本概括了面向对象的三个特征:继承性,封装性,多态性。本例的主要功能有:

  1. 让用户可以选择不同类型的图形;
  2. 对所选的图形输入其相关属性;
  3. 根据输入的属性计算该图形的周长和面积。

效果如下:

思路:

    1. A部分直接在index.PHP中写,点击对应是图形的时候发送一个$_GET["shape"]给自身页面,使用了自动加载类。
    2. B部分由form.class.php输出,其中使用了变量函数,用$_GET["shape"]的值调用不同的函数,确定不同图形的表单中input部分。
    3. C部分由result.class.php输出。声明一个抽象类,在rect,triangle,circle中实现抽象类中计算面积和周长的计算方法,体现继承性,封装性和多态性,使用new $_GET["shape"]()实例化对应图形的对象,再调用该对象中的方法,返回周长和面积。

需要改进的地方:

  1. 本例子只是为了作为演示类的几个特性,并没有对用户的输入进行过滤,可能造成注入攻击,不适用于实际生产应用。实际应用时应该对用户的输入进行过滤,防止恶意攻击。
  2. 没有用DIV+CSS对页面布局进行优化,界面不是很友好。可以优化布局,改善用户体验。

index.php代码如下:

 <html>
 <head>
         <meta http-equiv="charset" content="utf-8">
 </head>
 <body>
         <div id="center">
         <h1>图形周长面积计算器</h1>
         <!--点击链接的时候使用GET传递图形的形状属性给index.php,也就是页面本身-->
         <a href="index.php?shape=rect">矩形</a>
         <a href="index.php?shape=triangle">三角形</a>
         <a href="index.php?shape=circle">圆形</a>
         </div>
         <div id="inputForm">
 <?php
         /*自动加载类*/
         function __autoload($className){
                 include (($className).'.class.php');
         }
 
         /*
         1.先new一个Form对象,发现没有form类的定义,把类名Form传递到自动加载类的函数参数进行类的自动加载。
         2.echo一个对象的引用,会调用该对象的__toString方法返回一个字符串,echo输出的就是对象返回的字符串,
           这里输出一个表单等待用户的输入。
         */
         echo new Form("index.php");
 
         /*如果用户点击了提交按钮,自动加载result类,输出结果*/
         if(isset($_POST["sub"])){
                 echo new result();
         }
 ?>
         </div>
 </body>
 </html>

form.class.php代码如下:

 <?php
         /*
         project:面向对象版图形计算器
         file:form.class.php
         description:对不同的图形输出不同的表单
         */
         class form{
                 private $formAction=NULL;       //保存响应表单的文件
                 private $shape=NULL;            //保存图形的形状
 
                 /*
                 @param string $action 对象初始化传入的参数,代表响应的页面的是哪一个文件
                 */
                 function __construct($action = ""){
                         $this->formAction = $action;    //把传入的参数保存到$formAction中;
                         $this->shape = isset($_GET["shape"]) ? $_GET["shape"]:"rect";   //从表单传递的变量中获取图形类别,如没有传递,默认为矩形
                 }
                 function __toString(){
                         $form = '<form action="'.$this->formAction.'?shape='.$this->shape.'" method="post">';
                         //下面两行使用变量函数调用对应图形的私有函数,返回input部分表单的字符串
                         $shape = 'get'.($this->shape);
                         $form .= $this->$shape();
 
                         $form .= '</br><input type="submit" name="sub" value="计算"/></br>';
                         $form .= '</form>';
 
                         return $form;
                 }
                 //私有方法,返回矩形表单input部分的字符串;
                 private function getRect(){
                         //在表单提交后输入的内容继续显示,防止其消失
                         $formheight=isset($_POST['height']) ? $_POST['height'] : NULL;
                         $formwidth=isset($_POST['width']) ? $_POST['width'] : NULL;
                         $input = '<p>请输入矩形的长和宽</p>';
                         $input .= '矩形的高度:<input type="text" name="height" value="'.$formheight.'"/><br></br>';
                         $input .= '矩形的宽度:<input type="text" name="width" value="'.$formwidth.'"/></br>';
                         return $input;
                 }
                 //返回三角形输入表单input部分的字符串
                 private function getTriangle(){
                         //在表单提交后继续显示出来,防止其消失
                         $formside1=isset($_POST['side1']) ? $_POST['side1'] : NULL;
                         $formside2=isset($_POST['side2']) ? $_POST['side2'] : NULL;
                         $formside3=isset($_POST['side3']) ? $_POST['side3'] : NULL;
                         $input = '<p>请输入三角形的三边</p>';
                         $input .= '边长1:<input type="text" name="side1" value="'.$formside1.'" /></br></br>';
                         $input .= '边长2:<input type="text" name="side2" value="'.$formside2.'"/></br></br>';
                         $input .= '边长3:<input type="text" name="side3" value="'.$formside3.'"/></br>';
                         return $input;
                 }
                 //返回圆形表单input部分的字符串
                 private function getCircle(){
                         $formradius=isset($_POST['radius']) ? $_POST['radius'] : NULL;  //在输入表单提交后内容继续显示出来,防止其消失
                         $input = '<p>请输入半径</p>';
                         $input .= '半径:<input type="text" name="radius" value="'.$formradius.'"/></br>';
                         return $input;
                 }
         }
                                            

 result.class.php代码如下:

 <?php
 class result{
         private $shape = NULL;
 
         //使用GET传递的变量,实例化一个相应的对象,返回一个对象的引用;
         function __construct(){
                 $this->shape = new $_GET["shape"]();
         }
         //调用对象的属性和方法,返回周长和面积
         function __toString(){
                 $result = $this->shape->shapeName.'的周长为'.$this->shape->perimeter().'</br>';
                 $result .= $this->shape->shapeName.'的面积为'.$this->shape->area().'</br>';
                 return $result;
         }
 }                                                                                                                                      

 抽象类shape.class.php代码如下:

 <?php
 /*      
         project:面向对象版图形计算器
         file:shape.class.php
         description:抽象类,定义两个抽象方法area()和perimeter(),以及定义方法validate对输入的值进行验证
 */
 abstract class shape{
         public $shapeName;                      //形状名称;
         abstract function area();               //抽象类area(),让子类去实现,体现多态性
         abstract function perimeter();          //抽象类perimeter();
 
         /*
                 @param mixed $value 接受表单输入值
                 @param string $message 提示消息前缀
                 @param boolean 返回值,成功为TRUE,失败为FALSE
         */
         protected function validate($value,$message = "输入的值"){
                 if($value < 0 || $value == NULL || !($value)){
                         $message = $this->shapeName.$message;
                         echo '<font color="red">'.$message.'必须为正数</font><br>';
                         return FALSE;
                 }
                 else
                         return TRUE;
         }
 }

子类triangle.class.php代码如下:

 <?php
 /**
         project:面向对象版图形计算器
         file:triangle.class.php
         description:继承抽象类shape,计算并返回三角形的周长和面积
 */
 class triangle extends shape{
         private $side1 = 0;             //边长1;
         private $side2 = 0;             //边长2;
         private $side3 = 0;             //边长3;
 
         /*
                 构造函数:对表单变量进行合理性验证,通过则初始化三个边长
         */
         function __construct(){
                 $this->shapeName = "三角形";    //命名图形
 
                 //使用父类的方法validate检查输入的是否为正数
                 if($this->validate($_POST["side1"],"边长1") & $this->validate($_POST["side2"],"边长2") & $this->validate($_POST["side3"],"边长3")){
 
                         //使用私有方法验证两边和是否大于第三边
                         if($this->validatesum($_POST["side1"],$_POST["side2"],$_POST["side3"])){
                                 $this->side1 = $_POST["side1"];         //若通过验证初始化三边;
                                 $this->side2 = $_POST["side2"];
                                 $this->side3 = $_POST["side3"];
                         }
                         else{
                                 echo '<font color="red">两边的和要大于第三边</font>';
                                 exit();
                         }
                 }
                 else{
                         exit();
                 }
         }
         /*使用海伦公式计算面积,并返回结果*/
         function area(){
                 $s = ($_POST["side1"] + $_POST["side2"] + $_POST["side3"])/2;
                 return ($s * ($s - $_POST["side1"]) * ($s - $_POST["side2"]) * ($s - $_POST["side3"]));
         }
         /*计算并返回周长*/
         function perimeter(){
                 return $_POST["side1"] + $_POST["side2"] + $_POST["side3"];
         }
         /*计算三角形两边和是否大于第三边,是返回TRUE,否返回FALSE*/
         private function validatesum($side1,$side2,$side3){
                 if(($side1 + $side2) > $side3 && ($side1 + $side3) > $side2 && ($side2 + $side3) > $side1)
                         return TRUE;
                 else
                         return FALSE;
         }
 }

子类circle.class.php代码如下:

 <?php
 /*
         project:面向对象的图形计算器
         file:circle.class.php
         description:接收表单值,返回周长和面积
 */
 class circle extends shape{
         private $radius;        //圆的半径
 
         //初始化圆的名称,检查输入合法性并初始化半径
         function __construct(){
                 $this->shapeName = "圆形";
                 if($this->validate($_POST["radius"],"半径"))
                         $this->radius = $_POST["radius"];
         }
         //返回圆的面积
         function area(){
                 return 3.14 * $this->radius * $this->radius;
         }
         //返回圆的周长
         function perimeter(){
                 return 3.14 * 2 * $this->radius;
         }
 }

子类rect.class.php代码如下:

 <?php
 /*
         project:面向对象的图形计算器
         file:rect.class.php
         descrition:声明一个矩形资料,实现形状抽象类计算周长和面积的方法,返回矩形的周长和面积
 */
 class rect extends shape{
         private $width;         //矩形的宽度
         private $height;        //矩形的高度
 
         //使用父类的validate方法验证输入的合法性,通过则初始化宽度和高度
         function __construct(){
         $this->shapeName = "矩形";
         if($this->validate($_POST["width"],"宽度") && $this->validate($_POST["height"],"高度")){
                 $this->width = $_POST["width"];
                 $this->height = $_POST["height"];
         }
         }
         //返回面积
         function area(){
                 return $this->width * $this->height;
         }
         //返回周长
         function perimeter(){
                 return 2 * ($this->width + $this->height);
         }
 }

 声明:

  1.本文只适合实验,不适合现实应用,若造成不良后果,本人概不负责。

  2.本文为原创博客,可以在个人平台自由转载,但需要注明出处,附上链接,否则视为盗用。严禁用于商业用途,如有需要,联系本人支付稿费,授权后方能使用。