我正在学习 PHP OOP,现在我构建了一个基本的计算器。
这是我的代码index.php:
require_once 'Calculator.class.php';
require_once 'Adder.class.php';
require_once 'Substract.class.php';
require_once 'Operator.interface.php';
require_once 'Multiplier.class.php';
require_once 'Devider.class.php';
$c = new Calculator;
$c->setOperation(new Adder);
$c->calculate(10,50); // 60
echo $c->getResult();
Run Code Online (Sandbox Code Playgroud)
这是Calculator类文件:
class Calculator
{
protected $result;
protected $operation;
public function setOperation(OperatorInterface $operation)
{
$this->operation = $operation;
// var_dump($operation);
}
public function calculate()
{
foreach(func_get_args() as $number)
{
$this->result = $this->operation->run($number,$this->result);
}
}
public function getResult()
{
return $this->result;
}
}
Run Code Online (Sandbox Code Playgroud)
这是在这个类文件中调用的接口:
interface OperatorInterface
{
public function run($number,$result);
}
Run Code Online (Sandbox Code Playgroud)
这是Adder从以下调用的类index.php:
class Adder implements OperatorInterface
{
public function run($number,$result)
{
return $result + $number;
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,它看起来不错,还可以……但是我收到了这个奇怪的错误:
致命错误:在第 2 行 Adder.php 上找不到接口“OperatorInterface”
所以第 2 行Adder是这样的:
class Adder implements OperatorInterface
Run Code Online (Sandbox Code Playgroud)
这意味着我没有正确包含接口。但我确实包括了这一点。
那么为什么我会收到这个错误呢?
我在哪里犯了错误?
需要在Operator.interface.php文件之前包含Adder.class.php文件,否则编译器到Adder类的时候,还没有遇到调用的东西OperatorInterface,所以不能识别,也无法验证声明Adder类实现是否有效它。由于它也在Calculator类中被引用,因此您也应该在此之前包含它。
require_once 'Operator.interface.php';
require_once 'Calculator.class.php';
require_once 'Adder.class.php';
require_once 'Substract.class.php';
require_once 'Multiplier.class.php';
require_once 'Devider.class.php';
Run Code Online (Sandbox Code Playgroud)
应该就是这么简单——为了将来参考,你应该总是对你的包含进行排序,以便它们之间的依赖关系可以得到满足,因为它们是按照你提供的顺序进行处理的。