PHP学习笔记06——面向对象版图形计算器
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——面向对象版图形计算器的更多相关文章
- php:兄弟连之面向对象版图形计算器1
曾经看细说PHP的时候就想做这个,可是一直没什么时间,这次总算忙里偷闲搞了代码量比較多的project. 首先,文档结构,都在一个文件夹下就好了,我的就例如以下. 一開始,进入index.php文件. ...
- php:兄弟连之面向对象版图形计算器2
上篇说到通过result.class.php来分流,因为三个类都继承了shape这个类,让我们来看一下,面向对象中的继承. shape.class.shape文件 <?php abstract ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- UML和模式应用学习笔记-1(面向对象分析和设计)
UML和模式应用学习笔记-1(面向对象分析和设计) 而只是对情节的记录:此处的用例场景为:游戏者请求掷骰子.系统展示结果:如果骰子的总点数是7,则游戏者赢得游戏,否则为输 (2)定义领域模型:在领域模 ...
- 机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记
机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记 关键字:k-均值.kMeans.聚类.非监督学习作者:米仓山下时间: ...
- iOS学习笔记06—Category和Extension
iOS学习笔记06—Category和Extension 一.概述 类别是一种为现有的类添加新方法的方式. 利用Objective-C的动态运行时分配机制,Category提供了一种比继承(inher ...
- Lua学习笔记:面向对象
Lua学习笔记:面向对象 https://blog.csdn.net/liutianshx2012/article/details/41921077 Lua 中只存在表(Table)这么唯一一种数据结 ...
- 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 ...
- Java学习笔记之---面向对象
Java学习笔记之---面向对象 (一)封装 (1)封装的优点 良好的封装能够减少耦合. 类内部的结构可以自由修改. 可以对成员变量进行更精确的控制. 隐藏信息,实现细节. (2)实现封装的步骤 1. ...
随机推荐
- MySql计数器,如网站点击数,如何实现高性能高并发的计数器功能
MySql计数器,如网站点击数,如何实现高性能高并发的计数器功能 Clicks: Date: -- :: Power By 李轩Lane TagMysql计数器高性能 现在有很多的项目,对计数器的实现 ...
- HDU3487 Play With Chains(Splay)
很裸的Splay,抄一下CLJ的模板当作复习,debug了一个下午,收获是终于搞懂了以前看这个模板里不懂的内容.以前用这个模板的时候没有看懂为什么get函数返回的前缀要加个引用,经过一下午的debug ...
- 【linux】文字提取
提取IP地址: 方法①: ifconfig eth3|grep Bcast|cut -d ":" -f2|cut -d " " -f1 ifconfig: 显示 ...
- To Use Ubuntuubunt
1.rename PC; modify the /etc/hostname. 2.Use root account; 1.set the password for root account: sudo ...
- Android——横屏和竖屏的切换,以及明文密码的显示
查看API文档: android.content.pm.ActivityInfo 在手机的使用中,我们要根据不同的需求来改变屏幕的显示方向,一般在浏览信息时是竖屏,在玩游戏的时候就要切换到横屏. ...
- 创建MySQL存储过程示例
创建MySQL存储过程是学习MySQL数据库必须要掌握的知识,下文对创建MySQL存储过程作了详细的介绍,供您参考学习. AD:2013大数据全球技术峰会课程PPT下载 下文将教您如何创建MySQL存 ...
- powermockito “mock public 方法内部 Private方法的问题”
我需要测试的方法是 public 方法: public ResponseResult subscribe(SysSubscription sysSubscription) throws JsonGen ...
- Zabbix简介(第一章第一节)
Alexei Vladishev创建了Zabbix项目,当前处于活跃开发状态,Zabbix SIA提供支持. Zabbix是一个企业级的.开源的.分布式的监控套件 Zabbix可以监控网络和服务的监控 ...
- 文件格式PDF
pdf(Portable Document Format的简称,意为“便携式文档格式”),是由Adobe Systems用于与应用程序.操作系统.硬件无关的方式进行文件交换所发展出的文件格式.PDF文 ...
- MyBatis学习总结_16_Mybatis使用的几个建议
1.Mapper层参数为Map,由Service层负责重载. Mapper由于机制的问题,不能重载,参数一般设置成Map,但这样会使参数变得模糊,如果想要使代码变得清晰,可以通过service层来实现 ...