php面向对象编写计算器,使用面向对象的图形计算器

这个例子可能并不实用,但基本概括了面向对象的三个特征:继承性,封装性,多态性。本例的主要功能有:让用户可以选择不同类型的图形;

对所选的图形输入其相关属性;

根据输入的属性计算该图形的周长和面积。

效果如下:

20150615224200_3051.png

思路:A部分直接在index.php中写,点击对应是图形的时候发送一个$_GET["shape"]给自身页面,使用了自动加载类。

B部分由form.class.php输出,其中使用了变量函数,用$_GET["shape"]的值调用不同的函数,确定不同图形的表单中input部分。

C部分由result.class.php输出。声明一个抽象类,在rect,triangle,circle中实现抽象类中计算面积和周长的计算方法,体现继承性,封装性和多态性,使用new $_GET["shape"]()实例化对应图形的对象,再调用该对象中的方法,返回周长和面积。

需要改进的地方:本例子只是为了作为演示类的几个特性,并没有对用户的输入进行过滤,可能造成注入攻击,不适用于实际生产应用。实际应用时应该对用户的输入进行过滤,防止恶意攻击。

没有用DIV+CSS对页面布局进行优化,界面不是很友好。可以优化布局,改善用户体验。

index.php代码如下:

1

2

3 4

5

6

7

图形周长面积计算器

8

9 矩形

10 三角形

11 圆形

12

13

14 php15/*自动加载类*/16function __autoload($className){17include (strtolower($className).'.class.php');18}1920/*211.先new一个Form对象,发现没有form类的定义,把类名Form传递到自动加载类的函数参数进行类的自动加载。222.echo一个对象的引用,会调用该对象的__toString方法返回一个字符串,echo输出的就是对象返回的字符串,23这里输出一个表单等待用户的输入。24*/25echonew Form("index.php");2627/*如果用户点击了提交按钮,自动加载result类,输出结果*/28if(isset($_POST["sub"])){29echonewresult();30}31 ?>

32

33

34

form.class.php代码如下:

1 php2/*3project:面向对象版图形计算器4file:form.class.php5description:对不同的图形输出不同的表单6*/7classform{8private$formAction=NULL; //保存响应表单的文件9private$shape=NULL; //保存图形的形状1011/*12@param string $action 对象初始化传入的参数,代表响应的页面的是哪一个文件13*/14function __construct($action = ""){15$this->formAction = $action; //把传入的参数保存到$formAction中;16$this->shape = isset($_GET["shape"]) ? $_GET["shape"]:"rect"; //从表单传递的变量中获取图形类别,如没有传递,默认为矩形17}18function__toString(){19$form = '';20//下面两行使用变量函数调用对应图形的私有函数,返回input部分表单的字符串21$shape = 'get'.ucfirst($this->shape);22$form .= $this->$shape();2324$form .= '';25$form .= '';2627return$form;28}29//私有方法,返回矩形表单input部分的字符串;30privatefunctiongetRect(){31//在表单提交后输入的内容继续显示,防止其消失32$formheight=isset($_POST['height']) ? $_POST['height'] : NULL;33$formwidth=isset($_POST['width']) ? $_POST['width'] : NULL;34$input = '

请输入矩形的长和宽';35$input .= '矩形的高度:

';36$input .= '矩形的宽度:';37return$input;38}39//返回三角形输入表单input部分的字符串40privatefunctiongetTriangle(){41//在表单提交后继续显示出来,防止其消失42$formside1=isset($_POST['side1']) ? $_POST['side1'] : NULL;43$formside2=isset($_POST['side2']) ? $_POST['side2'] : NULL;44$formside3=isset($_POST['side3']) ? $_POST['side3'] : NULL;45$input = '

请输入三角形的三边';46$input .= '边长1:';47$input .= '边长2:';48$input .= '边长3:';49return$input;50}51//返回圆形表单input部分的字符串52privatefunctiongetCircle(){53$formradius=isset($_POST['radius']) ? $_POST['radius'] : NULL; //在输入表单提交后内容继续显示出来,防止其消失54$input = '

请输入半径';55$input .= '半径:';56return$input;57}58}59

result.class.php代码如下:

1 php2classresult{3private$shape = NULL;45//使用GET传递的变量,实例化一个相应的对象,返回一个对象的引用;6function__construct(){7$this->shape = new$_GET["shape"]();8}9//调用对象的属性和方法,返回周长和面积10function__toString(){11$result = $this->shape->shapeName.'的周长为'.$this->shape->perimeter().'';12$result .= $this->shape->shapeName.'的面积为'.$this->shape->area().'';13return$result;14}15 }

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

1 php2/*3project:面向对象版图形计算器4file:shape.class.php5description:抽象类,定义两个抽象方法area()和perimeter(),以及定义方法validate对输入的值进行验证6*/7abstractclassshape{8public$shapeName; //形状名称;9abstractfunction area(); //抽象类area(),让子类去实现,体现多态性10abstractfunction perimeter(); //抽象类perimeter();1112/*13@param mixed $value 接受表单输入值14@param string $message 提示消息前缀15@param boolean 返回值,成功为TRUE,失败为FALSE16*/17protectedfunction validate($value,$message = "输入的值"){18if($value < 0 || $value == NULL || !is_numeric($value)){19$message = $this->shapeName.$message;20echo ''.$message.'必须为正数

';21returnFALSE;22}23else24returnTRUE;25}26 }

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

1 php2/**3project:面向对象版图形计算器4file:triangle.class.php5description:继承抽象类shape,计算并返回三角形的周长和面积6*/7class triangle extendsshape{8private$side1 = 0; //边长1;9private$side2 = 0; //边长2;10private$side3 = 0; //边长3;1112/*13构造函数:对表单变量进行合理性验证,通过则初始化三个边长14*/15function__construct(){16$this->shapeName = "三角形"; //命名图形1718//使用父类的方法validate检查输入的是否为正数19if($this->validate($_POST["side1"],"边长1") & $this->validate($_POST["side2"],"边长2") & $this->validate($_POST["side3"],"边长3")){2021//使用私有方法验证两边和是否大于第三边22if($this->validatesum($_POST["side1"],$_POST["side2"],$_POST["side3"])){23$this->side1 = $_POST["side1"]; //若通过验证初始化三边;24$this->side2 = $_POST["side2"];25$this->side3 = $_POST["side3"];26}27else{28echo '两边的和要大于第三边';29exit();30}31}32else{33exit();34}35}36/*使用海伦公式计算面积,并返回结果*/37functionarea(){38$s = ($_POST["side1"] + $_POST["side2"] + $_POST["side3"])/2;39returnsqrt($s * ($s - $_POST["side1"]) * ($s - $_POST["side2"]) * ($s - $_POST["side3"]));40}41/*计算并返回周长*/42functionperimeter(){43return$_POST["side1"] + $_POST["side2"] + $_POST["side3"];44}45/*计算三角形两边和是否大于第三边,是返回TRUE,否返回FALSE*/46privatefunction validatesum($side1,$side2,$side3){47if(($side1 + $side2) > $side3 && ($side1 + $side3) > $side2 && ($side2 + $side3) > $side1)48returnTRUE;49else50returnFALSE;51}52 }

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

1 php2/*3project:面向对象的图形计算器4file:circle.class.php5description:接收表单值,返回周长和面积6*/7class circle extendsshape{8private$radius; //圆的半径910//初始化圆的名称,检查输入合法性并初始化半径11function__construct(){12$this->shapeName = "圆形";13if($this->validate($_POST["radius"],"半径"))14$this->radius = $_POST["radius"];15}16//返回圆的面积17functionarea(){18return 3.14 * $this->radius * $this->radius;19}20//返回圆的周长21functionperimeter(){22return 3.14 * 2 * $this->radius;23}24 }

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

1 php2/*3project:面向对象的图形计算器4file:rect.class.php5descrition:声明一个矩形资料,实现形状抽象类计算周长和面积的方法,返回矩形的周长和面积6*/7class rect extendsshape{8private$width; //矩形的宽度9private$height; //矩形的高度1011//使用父类的validate方法验证输入的合法性,通过则初始化宽度和高度12function__construct(){13$this->shapeName = "矩形";14if($this->validate($_POST["width"],"宽度") && $this->validate($_POST["height"],"高度")){15$this->width = $_POST["width"];16$this->height = $_POST["height"];17}18}19//返回面积20functionarea(){21return$this->width * $this->height;22}23//返回周长24functionperimeter(){25return 2 * ($this->width + $this->height);26}27 }

声明:

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

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

以上就介绍了使用面向对象的图形计算器,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值