Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在php中重写祖辈方法_Php_Oop_Multiple Inheritance - Fatal编程技术网

在php中重写祖辈方法

在php中重写祖辈方法,php,oop,multiple-inheritance,Php,Oop,Multiple Inheritance,我目前正在为一个应用程序编写一组骨架类,首先是一个名为StoreLogic的基类,它包含税务规则、折扣规则等。这些类包括Cart、Order、Quote等。。将扩展StoreLogic,因为它们都将使用StoreLogic提供的同一组方法 一旦这些核心类完成,我将通过扩展Cart、Order、Quote和StoreLogic来实现它们,因为这些类的每个应用程序将根据我们不同的客户需求而有所不同。从父类重写方法很容易,但在其子类扩展它们之前重写祖辈类似乎……不可能?我觉得我做这件事的方式不对(tm

我目前正在为一个应用程序编写一组骨架类,首先是一个名为StoreLogic的基类,它包含税务规则、折扣规则等。这些类包括Cart、Order、Quote等。。将扩展StoreLogic,因为它们都将使用StoreLogic提供的同一组方法

一旦这些核心类完成,我将通过扩展Cart、Order、Quote和StoreLogic来实现它们,因为这些类的每个应用程序将根据我们不同的客户需求而有所不同。从父类重写方法很容易,但在其子类扩展它们之前重写祖辈类似乎……不可能?我觉得我做这件事的方式不对(tm)。。我想像你这样更有经验的人也许能给我指出正确的方向。看看代码,看看你是怎么想的

/*我的核心类如下:*/
抽象类存储逻辑
{
公共函数applyDiscount(总计)
{
返回$total-10;
}
}
抽象类Cart扩展了StoreLogic
{
公共功能附加项($item\u name)
{
echo“已添加”。$item\u名称;
}
}
抽象类顺序扩展了存储逻辑
{
// ....
}
/*稍后,当我想使用这些核心类时,我需要能够重写它们
*方法,以便孙辈可以使用新的重写
*方法:
*/
类MyStoreLogic扩展了StoreLogic
{
公共函数applyDiscount(总计){
返回$total-5;
}
}
类MyOrder扩展了顺序
{
// ...
}
类MyCart扩展了Cart
{
公共开支总额=20美元;
公共职能部门doDiscounts()
{
$this->total=$this->applyDiscount($this->total);
echo$this->total;
}
}
$cart=newmycart();
$cart->doDiscounts();//使用StoreLogic,而不是MyStoreLogic。。

我认为您缺少一个非常基本的逻辑

- MyCart extends Cart
- Cart extends StoreLogic
如果要使用
MyStoreLogic
,则
cart
应定义为

 abstract class Cart extends MyStoreLogic
如果你不想那样做,那么你可以

$cart = new MyCart();
$cart->doDiscounts(new MyStoreLogic()); // output 15
类修改

class MyCart extends Cart {
    public $total = 20;
    public function doDiscounts($logic = null) {
        $this->total = $logic ? $logic->applyDiscount($this->total) : $this->applyDiscount($this->total);
        echo $this->total;
    }
}

正确,我不想改变购物车,因为它将成为图书馆的一部分。考虑一下,理想情况下,我希望MyCart扩展MyStoreLogic和Cart。。。我不认为php能做到这一点?!当然,将逻辑对象传递给父方法可能是实现GOI的唯一方法,这里的第二种方法是composition吗?似乎很明智。。但让我想知道什么时候应该使用组合,什么时候应该使用继承?