首页 > 代码库 > hp:兄弟连之面向对象版图形计算器2

hp:兄弟连之面向对象版图形计算器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 =http://www.mamicode.com/= "" ||!is_numeric($value)||$value < 0){>

这是一个抽象类,好处就在于,第一个,定义了统一的属性和方法。这样在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()方法,此为封装,都封装成一个类里面的方法即可。