我有两个基本课程:
这是我对代码的英语解释: Entree类应该使用一个名称,然后使用一些成分(它从这些成分中组成一个数组),然后使用此hasIngredient函数让我检查该数组是否具有某些元素...
然后是PricedEntree类,它扩展了Entree。它继承了一个构造,但同时也接受了数组并使用“ as”并将其放入“成分”,并循环遍历(通过foreach)。
我想使用PricedEntree类,因为我想访问getCost方法;但是我似乎无法对PricedEntree进行有效的实例化。我收到一个错误消息:
"Fatal error: Uncaught Exception: Elements of $ingredients must be Ingredient objects in /Library/WebServer/Documents/ex_f_6.1.php:22
Stack trace:
#0 /Library/WebServer/Documents/ex_f_6.1.php(43): PricedEntree->__construct('soup', Array)
#1 {main}
thrown in /Library/WebServer/Documents/ex_f_6.1.php on line 22".
我需要在PricedEntree中输入哪些有效参数? 另外,第21行是什么?我不知道是否应该引用Entree。
最终,我想从子类访问父类中已经存在的对象。 注意:我正在处理David Sklar的Php书。
我的代码:
<?php
class Entree {
public $name;
public $ingredients = array();
public function __construct($name, $ingredients) { if (! is_array($ingredients)) {
throw new Exception('$ingredients must be an array'); }
$this->name = $name;
$this->ingredients = $ingredients;
}
public function hasIngredient($ingredient) {
return in_array($ingredient, $this->ingredients);
} }
class PricedEntree extends Entree {
public function __construct($name, $ingredients) {
parent::__construct($name, $ingredients);
foreach ($this->ingredients as $ingredient) {
if (! $ingredient instanceof Entree) { //<---***** I don't know if 'Entree' is used correctly here
throw new Exception('Elements of $ingredients must be Ingredient objects');
}
}
}
public function getCost() {
$cost = 0;
foreach ($this->ingredients as $ingredient) {
$cost += $ingredient->getCost();
}
return $cost;
}
}
$soup = new Entree("mushroom_soup", array("yellow_feet","monkey","black_trumpet","toadstool"));
print $soup->name;
print "\r\n";
print_r($soup->ingredients);
print "\r\n";
$monkey_magic = new PricedEntree("soup", array("yellow_feet","monkey","black_trumpet","toadstool"));
print "\r\n";
?>
答案 0 :(得分:1)
您的PricedEntree
类将检查成分数组是否为Entree
对象的数组,您正在向其发送字符串数组。这行代码似乎没有任何意义:
if (! $ingredient instanceof Entree) { //<---***** I don't know if 'Entree' is used correctly here
throw new Exception('Elements of $ingredients must be Ingredient objects');
}
您似乎错过了应该去的Ingredient
类。
为什么PricedEntree中的每种配料都属于主菜?