加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

覆盖php中的祖父母方法

发布时间:2020-12-13 16:48:57 所属栏目:PHP教程 来源:网络整理
导读:我目前正在为一个应用程序编写一组框架类,从一个名为StoreLogic的基类开始,该基类包含税收规则,折扣规则等.类Cart,Order,Quote等将扩展StoreLogic,因为它们都将使用StoreLogic提供的同一组方法. 一旦完成这些核心类,我将通过扩展Cart,Quote和StoreLogic来实
我目前正在为一个应用程序编写一组框架类,从一个名为StoreLogic的基类开始,该基类包含税收规则,折扣规则等.类Cart,Order,Quote等将扩展StoreLogic,因为它们都将使用StoreLogic提供的同一组方法.

一旦完成这些核心类,我将通过扩展Cart,Quote和StoreLogic来实现它们,因为这些类的每个应用程序将根据我们的各种客户需求而不同.从父类重写方法很容易,但是在孩子们扩展它们之前覆盖祖父母的课程似乎……不可能?我觉得我这样做是错误的(t??m)…而且我认为像你这样经验丰富的人可能会指出我正确的方向.看看代码,看看你的想法!

/* My core classes are something like this: */
abstract class StoreLogic
{
    public function applyDiscount($total)
    {
        return $total - 10;
    }
}

abstract class Cart extends StoreLogic
{
    public function addItem($item_name)
    {
        echo 'added' . $item_name;
    }
}

abstract class Order extends StoreLogic
{
    // ....
}

/* Later on when I want to use those core classes I need to be able to override
 * methods from the grandparent class so the grandchild can use the new overriden
 * methods:
 */
class MyStoreLogic extends StoreLogic
{
    public function applyDiscount($total) {
        return $total - 5;
    }
}

class MyOrder extends Order
{
    // ...
}

class MyCart extends Cart
{
    public $total = 20;

    public function doDiscounts()
    {
        $this->total = $this->applyDiscount($this->total);
        echo $this->total;
    }
}

$cart = new MyCart();
$cart->doDiscounts(); // Uses StoreLogic,not MyStoreLogic..

解决方法

我想你在这里缺少一个非常基本的逻辑

- MyCart extends Cart
- Cart extends StoreLogic

如果要使用MyStoreLogic,则应将购物车定义为

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;
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读