如何将一个类的对象接受到该类的子类中

时间:2019-02-13 00:20:51

标签: php

我有两个基本课程:

这是我对代码的英语解释: 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";

?>

1 个答案:

答案 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中的每种配料都属于主菜?