index.php  用于显示页面

 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>图形计算器</title>
</head>
<body>
<center>
<h1>图形(周长&面积)计算器</h1>
<a href = "index.php?action=rect">矩形</a>
<a href = "index.php?action=circle">圆形</a>
</center>
<?php
//错误级别设置为除了注意全部输出,避免输出变量未定义等消息
error_reporting(E_ALL & ~E_NOTICE); //使用自动加载类技术
function __autoload($className){
include strtolower($className).".class.php";
} //实际是调用了Form类的__toString方法;
echo new Form("index.php"); if(isset($_POST["sub"])) {
echo new Result();
}
?>
</body> </html>

form.class.php  根据action不同(rect,circle)显示不同的form

 <?php
class Form {
private $action;
private $shape; function __construct($action = "") {
$this->action = $action;
//默认rect;
$this->shape = isset($_GET['action']) ? $_GET['action'] : "rect";
} function __toString() {
$form = '<form action = "'.$this->action.'?action='.$this->shape.'" method="post">'; //根据get请求组成方法名称字符串,例如GetRect()
$shape = "get".ucfirst($this->shape);
$form .= $this->$shape();
$form .= '<br/><input type="submit" name="sub" value="计算"><br/>';
$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/>';
return $input;
} private function getCircle() {
$input = '<b>请输入 | 圆形 | 的半径: </b><p>';
$input .= '半径: <input type="text" name="radius" value="'.$_POST["radius"].'"/><br/>';
return $input;
} }
?>

result.class.php  根据action构造对应的类并输出结果

 <?php
class Result {
private $shape = null;
//构造方法,根据action类新建类
function __construct(){
$this->shape = new $_GET['action']();
}
//利用多态性根据形状自动计算周长和面积
function __toString(){
$result = $this->shape->shapeName.'的周长: '.round($this->shape->perimeter(), 2).'<br/>';
$result .= $this->shape->shapeName.'的面积: '.round($this->shape->area(), 2).'<br/>';
return $result;
}
} ?>

shape.class.php  图形的基类,定义了计算面积和周长的抽象方法

 <?php
abstract class Shape {
public $shapeName;
//定义两个抽象方法,计算面积和周长
abstract function area();
abstract function perimeter(); //验证数据合法性的方法
protected function validate($value, $messgae = "输入值") {
if ($value==""||!is_numeric($value)||$value < 0) {
$messgae = $this->shapeName.$messgae;
echo '<font colr="red">'.$messgae.'不合法</font><br/>';
return false;
}
return true;
}
} ?>

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"];
}
} public function area() {
return $this->width * $this->height;
}
public function perimeter() {
return 2 * ($this->width + $this->height);
}
}
?>

circle.class.php  圆形的实现

 <?php
class Circle extends Shape {
private $radius = 0;
function __construct(){
$this->shapeName = "圆形";
if ($this->validate($_POST["radius"], "半径")) {
$this->radius = $_POST["radius"];
}
} public function area() {
return pi() * $this->radius * $this->radius;
}
public function perimeter() {
return 2 * pi() * $this->radius;
}
}
?>

页面结果

PHP学习笔记06——面向对象版图形计算器的更多相关文章

  1. php:兄弟连之面向对象版图形计算器1

    曾经看细说PHP的时候就想做这个,可是一直没什么时间,这次总算忙里偷闲搞了代码量比較多的project. 首先,文档结构,都在一个文件夹下就好了,我的就例如以下. 一開始,进入index.php文件. ...

  2. php:兄弟连之面向对象版图形计算器2

    上篇说到通过result.class.php来分流,因为三个类都继承了shape这个类,让我们来看一下,面向对象中的继承. shape.class.shape文件 <?php abstract ...

  3. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  4. UML和模式应用学习笔记-1(面向对象分析和设计)

    UML和模式应用学习笔记-1(面向对象分析和设计) 而只是对情节的记录:此处的用例场景为:游戏者请求掷骰子.系统展示结果:如果骰子的总点数是7,则游戏者赢得游戏,否则为输 (2)定义领域模型:在领域模 ...

  5. 机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记

    机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记 关键字:k-均值.kMeans.聚类.非监督学习作者:米仓山下时间: ...

  6. iOS学习笔记06—Category和Extension

    iOS学习笔记06—Category和Extension 一.概述 类别是一种为现有的类添加新方法的方式. 利用Objective-C的动态运行时分配机制,Category提供了一种比继承(inher ...

  7. Lua学习笔记:面向对象

    Lua学习笔记:面向对象 https://blog.csdn.net/liutianshx2012/article/details/41921077 Lua 中只存在表(Table)这么唯一一种数据结 ...

  8. ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则

    ASP.NET MVC 学习笔记-7.自定义配置信息   ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...

  9. Java学习笔记之---面向对象

    Java学习笔记之---面向对象 (一)封装 (1)封装的优点 良好的封装能够减少耦合. 类内部的结构可以自由修改. 可以对成员变量进行更精确的控制. 隐藏信息,实现细节. (2)实现封装的步骤 1. ...

随机推荐

  1. 服务接口API限流 Rate Limit 续

    一.前言 上一篇文章中粗浅的介绍使用Redis和基于令牌桶算法进行对服务接口API限流,本文介绍另一种算法---漏桶算法的应用.Nginx想必大家都有所了解是一个高性能的 HTTP 和反向代理服务器, ...

  2. Action Bar详解

    Action bar是一个标识应用程序和用户位置的窗口功能,并且给用户提供操作和导航模式.在大多数的情况下,当你需要突出展现用户行为或全局导航的activity中使用action bar,因为acti ...

  3. ExtJS之Ext.getDom

    <!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-equiv ...

  4. UVA 11038 - How Many O's? 计算对答案的贡献

    题意: 求[n, m]之间包含0的数字的个数题解:转化为求solve(n) - solve(m-1)的前缀问题 对于求0到n的解,我们举例 n = 25789 对于8这位,让其为0对答案的贡献是 (0 ...

  5. JS中的this好神奇,都把我弄晕了

    一.this的常见判断: 1.函数预编译过程 this —> window 2.全局作用域里 this —> window 3.call/apply 可以改变函数运行时this指向 4.o ...

  6. MyEclipse — Maven+Spring+Struts+Hibernate 整合 [学习笔记-1]

    示例数据库test,用户信息表

  7. 李洪强漫谈iOS开发[C语言-005]-程序结构分析

  8. hdu 1847 Good Luck in CET-4 Everybody!(简单博弈SG)

    #include<stdio.h> #include<string.h> #define N 1010 int hash[N]; int sg[N]; void GetSG() ...

  9. 不容错过的iOS 8的导航交互

    你曾注意过Safari移动客户端里美轮美奂的导航栏缩放效果么,以及那些tab bar是如何消失的吗? 在iOS 8中,苹果让这种类型的交互变得非常容易,虽然在WWDC上演示了缩放导航栏效果,不过后来他 ...

  10. QT5.3无法自动调用incomingConnection函数的问题(4.7没有这个问题)

    最近将qt4.7的一个工程移到5.3,遇到了几个麻烦事,主要是这个incomingConnection监听后无法自动调用的问题,在4.7上是完全没有问题的,到了5.3就不行,网上也查了下,网友们都是放 ...