上篇說到通過result.class.php來分流,由於三個類都繼承了shape這個類,讓我們來看一下,面向對象中的繼承。
shape.class.shape文件
<?php
abstract class shape{
public $shapeName;
abstract function area();
abstract function perimeter();
/*
* 所有的實體類都要繼承shape以便於統一方法和屬性
* 驗證 validate方法一致
* */
protected function validate($value,$message="形狀"){
if($value == "" ||!is_numeric($value)||$value < 0){
echo '<font color="red">'.$message.'必須爲非負值的數>字,並且不能爲空</font><br>';
return false;
} else{
return true;
}
}
}
?>
這是一個抽象類,好處就在於,第一個,定義了統一的屬性和方法。這樣在result裏面就可以統一的調用$shapename屬性和area()和perimeter()。
同事還可以構造公用的方法,比如驗證方法validate。
以下是具體每個類的實現
rect.class.php實現rect矩形類
<?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 ();
}
$this->width = $_POST ["width"];
$this->height = $_POST ["height"];
}
function area() {
return $this->width * $this->height;
}
function perimeter() {
return 2 * ($this->width + $this->height);
}
}
?>
triangle.class.php實現triangle三角形類
<?php
class Triangle extends Shape{
private $side1=0;
private $side2=0;
private $side3=0;
function __construct(){
$this->shapeName="三角形";
if($this->validate($_POST['side1'],'三角形的第一邊')&&
$this->validate($_POST['side2'],'三角形的第一邊')
&&$this->validate($_POST['side3'],'三角形的第一邊')){
$this->side1=$_POST["side1"];
$this->side2=$_POST["side2"];
$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;}
}
}
?>
circle.class.php實現circle圓類
<?php
class Circle extends Shape{
private $radius=0;
function __construct(){
$this->shapeName="圓形";
if($this->validate($_POST['radius'],'圓的半徑')){
$this->radius.$_POST["radius"];
}else{exit;}
$this->radius=$_POST["radius"];
}
function area(){
return pi()*$this->radius*$this->radius;
}
function perimeter(){
return 2*pi()*$this->radius;
}
}
?>
所有的類都繼承了shape類,實現裏面的方法和爲屬性賦值,用構造方法和具體不用的計算方法實現每個類不同的多態性,同時對外部調用人來說,都是調用area()和perimter()方法,此爲封裝,都封裝成一個類裏面的方法即可。