<?php
//利用簡單的工作類實現 計算器 加減乘除
//虛基類
abstract class Operator{
//設爲保護 除法的時候需要訪問
protected $NumA;
protected $NumB;
//構造函數
public function __construct($parmasFirst, $parmasSecond){
$this->NumA = $parmasFirst;
$this->NumB = $parmasSecond;
}
//虛函數
abstract function getResult();
}
//加法類
class OperatorAdd extends Operator{
//構造函數
public function __construct($parmasFirst, $parmasSecond){
parent::__construct($parmasFirst, $parmasSecond);
}
//析構函數
public function __destruct(){
}
//操作
public function getResult(){
return $this->NumA + $this->NumB;
}
}
//減法
class OperatorSub extends Operator{
//構造函數
public function __construct($parmasFirst, $parmasSecond){
parent::__construct($parmasFirst, $parmasSecond);
}
//析構函數
public function __destruct(){
}
//操作
public function getResult(){
return $this->NumA - $this->NumB;
}
}
//乘法
class OperatorMul extends Operator{
//構造函數
public function __construct($parmasFirst, $parmasSecond){
parent::__construct($parmasFirst, $parmasSecond);
}
//析構函數
public function __destruct(){
}
//操作的方法
public function getResult(){
return $this->NumA * $this->NumB;
}
}
//除法
class OperatorDiv extends Operator{
//構造函數
public function __construct($parmasFirst, $parmasSecond){
parent::__construct($parmasFirst, $parmasSecond);
}
//析構函數
public function __destruct(){
}
//操作的方法
public function getResult(){
if ($this->NumB == 0) {
throw new Exception("被除數不能爲0", 1);
return 0;
}
return $this->NumA / $this->NumB;
}
}
//工廠類
class OperatorFactory{
//用於符號和類的轉換
public $operatorTag = array(
'*' => 'mul',
'/' => 'div',
'-' => 'sub',
'+' => 'add'
);
//構造函數
public function __construct(){
}
//析構函數
public function __destruct(){
}
public function create($NumA, $NumB, $tag){
try{
//判斷是否有此操作符
$tag = strtolower($tag); //轉爲小寫
if(!array_key_exists($tag , $this->operatorTag)) {
throw new Exception('no operator tag');
return;
}
//獲取操作類名稱
$operatorName = $this->operatorTag[$tag];
$operatorClassName = 'operator'.ucfirst($operatorName);
//操作類是否存在
if(!class_exists($operatorClassName)) {
throw new Exception('no operator class');
return;
}
//創建類並執行操作
$operationObj = new $operatorClassName( $NumA, $NumB);
$result = $operationObj->getResult();
$operationObj = null;
return $result;
}catch(Exception $e){
$msg = $e->getmessage();
die($msg);
return 0;
}
}
}
//這邊進行測試
$test = new OperatorFactory();
echo $test->create( 3, 1, '+');