zoukankan      html  css  js  c++  java
  • 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()方法,此为封装,都封装成一个类里面的方法就可以。

  • 相关阅读:
    类数组对象与arguments
    bind的模拟实现
    new的模拟实现
    call和apply的模拟实现
    参数按值传递
    闭包
    执行上下文
    ECMAScript规范解读this
    缓存使用-8、redis的缓存穿透和缓存雪崩
    缓存使用-7、Redis 为什么是单线程的
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/3870622.html
Copyright © 2011-2022 走看看