我创建了一个名为Calculator的类,它带有加,减,乘和除功能.计算器仅限于添加两个数字并返回结果.我对OOP比较陌生,想在课堂上得到一些输入,我是否采取了漫长的路线,如果我做的是有另一种简化课程的方法.
这是代码:
class Calculator {
private $_val1 , $_val2;
public function __construct($val1, $val2){
$this->_val1 = $val1;
$this->_val2 = $val2;
}
public function add(){
return $this->_val1 + $this->_val2;
}
public function subtract(){
return $this->_val1 - $this->_val2;
}
public function multiply (){
return $this->_val1 * $this->_val2;
}
public function divide () {
return $this->_val1 / $this->_val2;
}
}
$calc = new Calculator(3,4);
echo "<p>3 + 4 = ".$calc->add(). "</p>";
$calc = new Calculator (15,12);
echo "<p>15 - 12 = ".$calc->subtract(). "</p>";
$calc = new Calculator (20,2);
echo "<p> 20 * 2 = ".$calc->multiply(). "</p>";
$calc = new Calculator (20,2);
echo "<p> 20 / 2 = ".$calc ->divide(). "</p>";
Run Code Online (Sandbox Code Playgroud)
恕我直言,你应该使用多态性.
本视频可以帮助您理解这一原则
这是我的思维方式.
首先,为您需要的任何操作定义接口
interface OperationInterface
{
public function evaluate(array $operands = array());
}
Run Code Online (Sandbox Code Playgroud)
然后,创建计算器支架
class Calculator
{
protected $operands = array();
public function setOperands(array $operands = array())
{
$this->operands = $operands;
}
public function addOperand($operand)
{
$this->operands[] = $operand;
}
/**
* You need any operation that implement the given interface
*/
public function setOperation(OperationInterface $operation)
{
$this->operation = $operation;
}
public function process()
{
return $this->operation->evaluate($this->operands);
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以定义操作,例如,添加
class Addition implements OperationInterface
{
public function evaluate(array $operands = array())
{
return array_sum($operands);
}
}
Run Code Online (Sandbox Code Playgroud)
你会像以下一样使用它:
$calculator = new Calculator;
$calculator->setOperands(array(4,2));
$calculator->setOperation(new Addition);
echo $calculator->process(); // 6
Run Code Online (Sandbox Code Playgroud)
有了这一点,如果要添加任何新行为或修改现有行为,只需创建或编辑一个类.
例如,假设您需要模数运算
class Modulus implements OperationInterface
{
public function evaluate(array $operands = array())
{
$equals = array_shift($operands);
foreach ($operands as $value) {
$equals = $equals % $value;
}
return $equals;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,
$calculator = new Calculator;
$calculator->setOperands(array(4,2));
$calculator->setOperation(new Addition); // 4 + 2
echo $calculator->process(); // 6
$calculator->setOperation(new Modulus); // 4 % 2
echo $calculator->process(); // 0
$calculator->setOperands(array(55, 10)); // 55 % 10
echo $calculator->process(); // 5
Run Code Online (Sandbox Code Playgroud)
如果您计划重用此代码或将其作为库提供,则用户不会修改您的源代码.
但是,如果他想要一个Substraction或一个BackwardSubstraction未定义的方法怎么办?
他只需要Substraction在他的项目中创建自己的类,该项目的实现OperationInterface是为了与您的库一起工作.
在查看项目架构时,更容易看到这样的文件夹
- app/
- lib/
- Calculator/
- Operation/
- Addition.php
- Modulus.php
- Substraction.php
- OperationInterface.php
- Calculator.php
Run Code Online (Sandbox Code Playgroud)
并立即知道哪个文件包含所需的行为.
你可能最终应该做类似的事情
$calc = new Calculator();
$calc->sum($x, $y, $z);
$calc->substract($x, $y);
....
Run Code Online (Sandbox Code Playgroud)
看一下这个例子。您可以使用 func_num_args() 给出任意数量的参数
<?php
function foo()
{
$numargs = func_num_args();
echo "Number of arguments: $numargs\n";
}
foo(1, 2, 3);
?>
// output: Number of arguments: 3
Run Code Online (Sandbox Code Playgroud)