php:兄弟連之面向對象版圖形計算器2

上篇說到通過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()方法,此爲封裝,都封裝成一個類裏面的方法即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章