php类的链实例化

php类的链实例化,php,Php,我有三个php类。我可以这样实例化它们: $piza = new Mashrooms(new SeaFood(new PlainPiza())); $temp = Mashrooms(new SeaFood(new PlainPiza())); $piza = new $temp; 但是,当我尝试以这种方式动态实例化它们时: $piza = new Mashrooms(new SeaFood(new PlainPiza())); $temp = Mashrooms(new SeaFo

我有三个php类。我可以这样实例化它们:

$piza = new Mashrooms(new SeaFood(new PlainPiza())); 
$temp = Mashrooms(new SeaFood(new PlainPiza())); 
$piza = new $temp;
但是,当我尝试以这种方式动态实例化它们时:

$piza = new Mashrooms(new SeaFood(new PlainPiza())); 
$temp = Mashrooms(new SeaFood(new PlainPiza())); 
$piza = new $temp;
它失败并显示此错误:

致命错误:未找到类“SeaFoodnew Mashrooms”

感谢您的帮助。

$temp是一个对象,而不是一个类,您不能在现有对象上使用new关键字

$plain = 'PlainPiza';
$seafood = 'SeaFood';
$mashrooms = 'Mashrooms';

$piza = new $mashrooms(new $seafood(new $plain)));
鉴于新的信息


问题是我不知道要实例化多少类

我认为你的方法可能是错误的。你有没有想过开一个比萨饼课,把你的浇头对象添加到比萨饼对象中?例如:

<?php

class Pizza
{
    private $_toppings;
    private $_placements = array('left', 'right', 'whole');

    public function _construct()
    {
        foreach($this->_placements as $placement)
        {
            $this->_toppings[$placement] = array();
        }
    }

    public function add_topping(Base_Topping $topping, $placement)
    {
        if(in_array($placement, $this->_placements))
        {
            array_push($this->_toppings[$placement], $topping);
        }
    }
}

abstract class Base_Topping
{
    protected $_price = 0.00;
    protected $_name = 'No Name';

    public function get_name()
    {
        return $this->_name;
    }

    public function get_price()
    {
        return $this->_price;
    }
}

class Mushrooms extends Base_Topping
{
    protected $_price = '1.00';
    protected $_name = 'Mushrooms';
}

// assuming $_POST['toppings'] = array('Mushrooms' => 'whole', 'Pepperoni' => 0, 'Sausage' => 0, etc...)
$pizza = new Pizza();
$toppings = array_filter($_POST); // will return anything with a non-false value
foreach($toppings as $name => $coverage)
{
    $topping = new $name();
    $pizza->add_topping($topping, $coverage);
}

?>
这将有助于:

$temp = "Mashrooms";
$pizza = new $temp(new SeaFood(new PlainPiza()));

请参见此处:

为什么需要这样做?这不是PHP中用于实例化对象的语法……我使用的是decorator设计模式。我希望用户选择一个浇头,并据此计算价格。问题是我不知道我将实例化多少类。这取决于用户选择浇头的方式。