作用于对象的php oop actor

作用于对象的php oop actor,php,oop,architecture,Php,Oop,Architecture,考虑到建筑 我通常有一个购物车类,包含addItem和removeItem方法(以及其他一些方法)。然而,本着现实世界的精神,购物车应该由客户操作——因此,addtoCart/removefromCart是否应该成为客户的一种方法 或者我应该有一个iTerMedia CustomerActsOnCart对象,它将customer和cart对象作为构造函数中的参数,并在其中执行操作 任何沉思都是最受欢迎的…在我看来。。。Customer类和Cart类之间具有1x1关系,因此您可以在Cart中放置C

考虑到建筑

我通常有一个购物车类,包含addItem和removeItem方法(以及其他一些方法)。然而,本着现实世界的精神,购物车应该由客户操作——因此,addtoCart/removefromCart是否应该成为客户的一种方法

或者我应该有一个iTerMedia CustomerActsOnCart对象,它将customer和cart对象作为构造函数中的参数,并在其中执行操作


任何沉思都是最受欢迎的…

在我看来。。。Customer类和Cart类之间具有1x1关系,因此您可以在Cart中放置Customer对象的引用。。或者将Cart对象放在客户的内部,我认为最好使用第二个选项,因为获取当前用户更容易,然后您可以执行以下操作:

$current_user->getCart()->addtoCart()
并将addtoCart/removeItem方法保留在Cart对象中


希望它有帮助

即使您给
客户
方法
addToCart()
removeFromCart()
,您仍然需要在
ShoppingCart
中有一些逻辑,才能让这些方法在添加或删除项目时真正改变状态。依我看,在这种情况下,参与者最好通过提及拥有客户和/或代理来表示,例如:

$cart = new ShoppingCart;
$cart->setOwner(new Customer);
$cart->addItem(new Item('Apples'));
$cart->checkout();
您也可以从客户处着手,例如:

$customer = new Customer;
$customer->setShoppingCart(new ShoppingCart);
$customer->addItemToShoppingCart(new Item('Apples'));
$customer->checkout();
但是方法名
addItemToShoppingCart
已经暗示
客户
作用于
购物车
,因此您很可能在里面这样做

$this->getShoppingCart()->addItem($item);
如果
ShoppingCart
Customer
的一部分,我们希望隐藏其实现细节,那么我们可以使用类似的方法,但由于
ShoppingCart
不是客户的基本部分,因此此方法不应针对客户。这只是一个方便的代理

您可以为
客户
创建一个代理来处理购物行为。这将使如何购物与客户脱钩,例如

class ShoppingDecorator
{
    protected $actor;
    protected $cart;
    protected function __construct($actor) { ... }
    public function getCart() { ... };
    public function addToCart() { ... }
    ...
}
这还允许您将购物行为应用于可能需要此行为的其他参与者


CustomerActsOnCart
方法听起来有点像。但不确定这是否可行。

我认为1:1的关系是关键。在现实生活中的超市市场中,许多顾客使用单一的购物车,尽管是连续的。在像亚马逊这样的虚拟商店中,ShoppingCart是单个客户的属性。但是客户有许多不同的活动,因此将与购物车相关的方法保留在购物车上更为干净。1:1的关系似乎过于严格。---如果多人想要共享一个购物车怎么办?(家庭购物为某人买生日礼物)。或者,如果客户想要多个购物车(商务购物和个人购物,同时使用不同的信用卡)?1对1的关系不是一个给定的关系。您可能需要一个客户访问多个购物车,或者实际上需要许多客户访问一个购物车,这取决于您的需求。我认为,改变演员的添加/删除是模拟现实世界最合乎逻辑的方式。当然,这只是一个例子;)是的,这取决于要求,无论如何,有“传统方式”作为参考总是好的,因为我从未见过一个网站,不同的帐户共享同一个购物车,在这种情况下,关系将更改为1xN,并且我仍然将参考购物车保留在Customer类中。我喜欢前两个示例,说明如何使用购物车或客户对购物车进行操作。确实有助于澄清问题。