这个例子可能并不实用,但基本概括了面向对象的三个特征:继承性,封装性,多态性。本例的主要功能有:
让用户可以选择不同类型的图形;对所选的图形输入其相关属性;根据输入的属性计算该图形的周长和面积。效果如下:
思路:
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/*21 1.先new一个form对象,发现没有form类的定义,把类名form传递到自动加载类的函数参数进行类的自动加载。22 2.echo一个对象的引用,会调用该对象的__tostring方法返回一个字符串,echo输出的就是对象返回的字符串,23 这里输出一个表单等待用户的输入。24*/25echonew form(index.php);2627/*如果用户点击了提交按钮,自动加载result类,输出结果*/28if(isset($_post[sub])){29echonew result();30 }31 ?>32
33 34
form.class.php代码如下:
1 php 2/* 3 project:面向对象版图形计算器 4 file:form.class.php 5 description:对不同的图形输出不同的表单 6*/ 7class form{ 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 = '
formaction.'?shape='.%24this->shape.' method=post>';20//下面两行使用变量函数调用对应图形的私有函数,返回input部分表单的字符串21$shape = 'get'.ucfirst($this->shape);22$form .= $this->$shape();2324$form .= '';25$form .= '';2627return$form;28 }29//私有方法,返回矩形表单input部分的字符串;30privatefunction getrect(){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部分的字符串40privatefunction gettriangle(){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部分的字符串52privatefunction getcircle(){53$formradius=isset($_post['radius']) ? $_post['radius'] : null; //在输入表单提交后内容继续显示出来,防止其消失54$input = '请输入半径
';55$input .= '半径:';56return$input;57 }58 }59 result.class.php代码如下:
1 php 2class result{ 3private$shape = null; 4 5//使用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 php 2/* 3 project:面向对象版图形计算器 4 file:shape.class.php 5 description:抽象类,定义两个抽象方法area()和perimeter(),以及定义方法validate对输入的值进行验证 6*/ 7abstractclass shape{ 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 $value == null || !is_numeric($value)){19$message = $this->shapename.$message;20echo ''.$message.'必须为正数
';21returnfalse;22 }23else24returntrue;25 }26 }
子类triangle.class.php代码如下:
1 php 2/** 3 project:面向对象版图形计算器 4 file:triangle.class.php 5 description:继承抽象类shape,计算并返回三角形的周长和面积 6*/ 7class triangle extends shape{ 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/*使用海伦公式计算面积,并返回结果*/37function area(){38$s = ($_post[side1] + $_post[side2] + $_post[side3])/2;39returnsqrt($s * ($s - $_post[side1]) * ($s - $_post[side2]) * ($s - $_post[side3]));40 }41/*计算并返回周长*/42function perimeter(){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 php 2/* 3 project:面向对象的图形计算器 4 file:circle.class.php 5 description:接收表单值,返回周长和面积 6*/ 7class circle extends shape{ 8private$radius; //圆的半径 910 //初始化圆的名称,检查输入合法性并初始化半径11function __construct(){12$this->shapename = 圆形;13if($this->validate($_post[radius],半径))14$this->radius = $_post[radius];15 }16//返回圆的面积17function area(){18return 3.14 * $this->radius * $this->radius;19 }20//返回圆的周长21function perimeter(){22return 3.14 * 2 * $this->radius;23 }24 }
子类rect.class.php代码如下:
1 php 2/* 3 project:面向对象的图形计算器 4 file:rect.class.php 5 descrition:声明一个矩形资料,实现形状抽象类计算周长和面积的方法,返回矩形的周长和面积 6*/ 7class rect extends shape{ 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//返回面积20function area(){21return$this->width * $this->height;22 }23//返回周长24function perimeter(){25return 2 * ($this->width + $this->height);26 }27 }
声明:
1.本文只适合实验,不适合现实应用,若造成不良后果,本人概不负责。
2.本文为原创博客,可以在个人平台自由转载,但需要注明出处,附上链接,否则视为盗用。严禁用于商业用途,如有需要,联系本人支付稿费,授权后方能使用。
以上就介绍了使用面向对象的图形计算器,包括了方面的内容,希望对php教程有兴趣的朋友有所帮助。