PHP封装 继承 多态例子

猫斯基  — PHP


/* 
 猫斯基 maosiji.com
 
	形状
 */
abstract class Xz {
	
	public $name;
	// 求面积
	abstract function mj();
	// 求周长
	abstract function zc();
	// 表单界面
	abstract function view();
	// 验证
	abstract function yz($arr);
}

/* 
	矩形 
 */
class Jx extends Xz {
	
	private $width;
	private $height;
	
	function __construct( $arr=array() ) {
		if ( !empty($arr) ) {
			$this->width = $arr['width'];
			$this->height = $arr['height'];
		}
		$this->name = '矩形';
	}
	
	function mj(){
		return $this->width * $this->height;
	}
	
	function zc(){
		return ($this->width + $this->height) * 2;
	}
	
	function view(){
		$form = "<form action='a.php?action=jx' method='post'>";
		$form .= $this->name.' 的宽:<input type="text" name="width" value="'.$_POST['width'].'"/><br>';
		$form .= $this->name.' 的高:<input type="text" name="height" value="'.$_POST['height'].'"/><br>';
		$form .= '<input type="submit" name="submit" value="计算"/><br>';
		$form .= "</form>";
		echo $form;
	}
	
	function yz( $arr ){
		$flag = true;
		if ( $arr['width'] < 0 ) {
			echo "{$this->name} 的宽不能小于等于0";
			$flag = false;
		}
		if ( $arr['height'] < 0 ) {
			echo "{$this->name} 的高不能小于等于0";
			$flag = false;
		}
		return $flag;
	}
	
}

/* 
	三角形
 */
class Sjx extends Xz {
	private $c1;
	private $c2;
	private $c3;
	
	function __construct( $arr=array() ) {
		if ( !empty($arr) ) {
			$this->c1 = $arr['c1'];
			$this->c2 = $arr['c2'];
			$this->c3 = $arr['c3'];
		}
		$this->name = '三角形';
	}
	// 海伦公式求面积
	function mj(){
		$p = ($this->c1 + $this->c2 + $this->c3) / 2;
		
		return sqrt($p*($p-$this->c1)*($p-$this->c2)*($p-$this->c3));
	}
	
	function zc(){
		return $this->c1 + $this->c2 + $this->c3;
	}
	
	function view(){
		$form = "<form action='a.php?action=sjx' method='post'>";
		$form .= $this->name.' 的c1:<input type="text" name="c1" value="'.$_POST['c1'].'"/><br>';
		$form .= $this->name.' 的c2:<input type="text" name="c2" value="'.$_POST['c2'].'"/><br>';
		$form .= $this->name.' 的c3:<input type="text" name="c3" value="'.$_POST['c3'].'"/><br>';
		$form .= '<input type="submit" name="submit" value="计算"/><br>';
		$form .= "</form>";
		echo $form;
	}
	
	function yz( $arr ){
		$flag = true;
		if ( $arr['c1'] < 0 ) {
			echo "{$this->name} 的 c1 不能小于等于0";
			$flag = false;
		}
		if ( $arr['c2'] < 0 ) {
			echo "{$this->name} 的 c2 不能小于等于0";
			$flag = false;
		}
		if ( $arr['c3'] < 0 ) {
			echo "{$this->name} 的 c3 不能小于等于0";
			$flag = false;
		}
		// 两边之和大于第三边
		if ( 
			$arr['c1'] + $arr['c2'] < $arr['c3'] || 
			$arr['c1'] + $arr['c3'] < $arr['c2'] || 
			$arr['c3'] + $arr['c2'] < $arr['c1']
		) {
			echo "两边之和大于第三边";
			$flag = false;
		}
		return $flag;
	}
}
?>
<!DOCTYPE html>
<html>
	<head>
		<title>极简的图形计算器</title>
		<meta charset="utf-8" />
	</head>
	<body>
		<center>
			<h1>极简的图形计算器</h1>
			<a href="a.php?action=jx">矩形</a>  
			<a href="a.php?action=sjx">三角形</a>  
			<a href="a.php?action=yx">圆形</a>  
			<hr />
		</center>
		<br /><br />
		<?php 
		class LoadClass {
			// 自动加载类文件
			public static function loadprint( $classname ) {
				$file = strtolower($classname).'.class.php';
				if ( $file ) {
					include $file;
				}
			}
		}
			
		spl_autoload_register( array('LoadClass', 'loadprint') );
		
		// 判断用户是否有单击链接
		if ( !empty($_GET['action']) ) {
			
			// 创建形状的对象
			$classname = ucfirst( $_GET['action'] );
			$xz = new $classname( $_POST );
			// 调用对象中的界面 view
			$xz->view();
			// 用户是否提交了对应图形界面的表单
			if ( isset($_POST['submit']) ) {
				// 验证用户输入的数据
				if ( $xz->yz($_POST) ) {
					// 计算图形的面积、周长
					echo $xz->name.' 的面积:'.$xz->mj().'<br>';
					echo $xz->name.' 的周长:'.$xz->zc().'<br>';
				}
			}
			
		}
		// 若没有单击链接,则提示
		else {
			echo '请选择计算什么图形!';
		}
		?>
	</body>
</html>

阅读量:0 2021-02-04 13:59

返回顶部