版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36143023/article/details/80017351
刚刚学完php面向对象的编程,参考着高洛峰老师的php教程学习了这个实例。
效果图片:
以下是实现代码:
index.php
<html>
<head>
<title>图形计算(使用面向对象开发技术)</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<center>
<h1>图形(周长&面积) 计算器</h1>
<a href="index.php?action=rect">矩形</a>
<a href="index.php?action=triangle">三角形</a>
<a href="index.php?action=circle">圆形</a>
<hr>
</center>
<?php //php代码部分
error_reporting(E_ALL & ~E_NOTICE);//提示错误的等级
// __autoload是php中的魔术方法,在用到类的时候自动调用
function __autoload($className){
//自动导入这个类
include strtolower($className).".class.php";
}
//输出表单,form类中有魔术方法__toString,因此可以直接输出类的对象引用,就是输出对象返回的字符串
echo new Form();
if(isset($_POST["sub"])){
//输出结果
echo new Result();//直接输出对象的引用表示
}
?>
</body>
</html>
form.class.php_这是表单类_
<?php
//根据index中提交的不同action的值返回不同的表单
class Form{
private $action;
private $shape;
//构造方法
function __construct($action=""){
$this->action = $action;
$this->shape=isset($_REQUEST["action"])?$_REQUEST["action"]:"rect";
}
function __toString()
{
// TODO: Implement __toString() method.
$form='<form action="'.$this->action.'" method="post">';
switch($this->shape){
case "rect":
$form.=$this->getRect();
break;
case "triangle":
$form.=$this->getTriangle();
break;
case "circle":
$form.=$this->getCircle();
break;
default:
$form.='请选择一个形状<br>';
}
$form.='<input type="submit" name="sub" value="计算">';
$form.='</form>';
return $form;
}
private function getRect(){
$input='<b>请输入 | 矩形 | 的宽度和高度:</b><p>';
$input.='宽度:<input type="text" name="width" value="'.$_POST['width'].'"><br>';
$input.='高度:<input type="text" name="height" value="'.$_POST['height'].'"><br>';
$input.='<input type="hidden" name="action" value="rect">';
return $input;
}
private function getTriangle(){
$input='<b>请输入 | 三角形 | 的三条边:</b><p>';
$input.='第一边: <input type="text" name="side1" value="'.$_POST['side1'].'" ><br>';
$input.='第二边: <input type="text" name="side2" value="'.$_POST['side2'].'" ><br>';
$input.='第三边: <input type="text" name="side3" value="'.$_POST['side3'].'" ><br>';
$input.='<input type="hidden" name="action" value="triangle">';
return $input;
}
private function getCircle(){
$input='<b>请输入 | 圆形 | 的半径:</b><p>';
$input.='半径: <input type="text" name="radius" value="'.$_POST['radius'].'" ><br>';
$input.='<input type="hidden" name="action" value="circle">';
return $input;
}
}
/**
* Created by PhpStorm.
* User: user
* Date: 2018/4/15
* Time: 16:26
*
*/
shape.class.php 这是一个抽象类,用来定义规范的
<?php
abstract class Shape {
public $shapeName;
//规范circle、triangle、rect中必须有area()、perimeter()方法
abstract function area();
abstract function perimeter();
public function setShapeName($shapeName)
{
$this->shapeName = $shapeName;
return $this;
}
//判断输入的数字是否为大于0的有效数字
protected function validate($value, $message="形状"){
if($value == "" || !is_numeric($value) || $value < 0 ){
echo '<font color="red"> '.$message.' 必须为非负值的数字,并且不能为空 </font><br>';
return false;
} else {
return true;
}
}
}
/**
* Created by PhpStorm.
* User: user
* Date: 2018/4/15
* Time: 16:42
*/
circle.class.php_就是计算周长和面积的公式了_
<?php
class Circle extends Shape {
private $radius=0;
function __construct(){
$this->shapeName="圆形";
if($this->validate($_POST['radius'], '圆的半径')){
$this->radius=$_POST["radius"];
}else{
exit;
}
}
function area(){
return pi()*$this->radius*$this->radius;
}
function perimeter(){
return 2*pi()*$this->radius;
}
}
/**
* Created by PhpStorm.
* User: user
* Date: 2018/4/15
* Time: 17:06
*/
rect.class.php
<?php
class Rect extends Shape{
private $width=0;
private $height=0;
function __construct()
{
$this->shapeName="矩形";
if($this->validate($_POST["width"],'矩形的宽度') & $this->validate($_POST["height"],'矩形的高度'))
{
$this->width=$_POST["width"];
$this->height=$_POST["height"];
}
else{
exit;
}
}
function area(){
return $this->width*$this->height;
}
function perimeter()
{
return 2 * ($this->width + $this->height);
}
}
/**
* Created by PhpStorm.
* User: user
* Date: 2018/4/15
* Time: 17:02
*/
triangle.class.php
<?php
class Triangle extends Shape{
private $side1=0;
private $side2=0;
private $side3=0;
function __construct(){
$this->shapeName="三角形";
if($this->validate($_POST['side1'], '三角形的第一个边')){
$this->side1=$_POST["side1"];
}
if($this->validate($_POST['side2'], '三角形的第二个边')){
$this->side2=$_POST["side2"];
}
if($this->validate($_POST['side3'], '三角形的第三个边')){
$this->side3=$_POST["side3"];
}
if(!$this->validateSum()){
echo '<font color="red">三角形的两边之和必须大于第三边</font>';
exit;
}
}
function area(){
$s=( $this->side1+$this->side2+$this->side3 )/2;
return sqrt( $s * ($s - $this->side1) * ($s - $this->side2) * ($s - $this->side3) );
}
function perimeter(){
return $this->side1+$this->side2+$this->side3;
}
private function validateSum()
{
$condition1 = ($this->side1 + $this->side2) > $this->side3;
$condition2 = ($this->side1 + $this->side3) > $this->side2;
$condition3 = ($this->side2 + $this->side3) > $this->side1;
if ($condition1 && $condition2 && $condition3) {
return true;
} else {
return false;
}
}
}
/**
* Created by PhpStorm.
* User: user
* Date: 2018/4/15
* Time: 17:04
*/
result.class.php_这里是返回计算结果类_
<?php
class Result{
private $shape;
function __construct()
{
switch($_POST['action']){
case 'rect':
$this->shape=new Rect();
break;
case 'triangle':
$this->shape=new Triangle();
break;
case 'circle':
$this->shape=new Circle();
break;
default:
$this->shape=false;
}
}
/**
* @return string
*/
function __toString()
{
// TODO: Implement __toString() method.
if($this->shape){
$result=$this->shape->shapeName.'的周长:'.$this->shape->perimeter().'<br>';
$result.=$this->shape->shapeName.'的面积:'.$this->shape->area().'<br>';
return $result;
}else{
return '没有这个形状';
}
}
}
/**
* Created by PhpStorm.
* User: user
* Date: 2018/4/15
* Time: 16:47
*/