php-使用对象组合重构类

php-使用对象组合重构类,php,class,refactoring,Php,Class,Refactoring,我最近花了一些时间重构了一个旧的个人项目,我想用它作为一种学习经验,学习如何最好地处理此类课程 问题是我的类(项目)有两种性别(将来可能更像是项目的海报,以及项目的帽子/配件),每种性别都使用几乎相同的方法来获取和设置有关它们的内容(获取产品图像、设置价格等) 我想重构这个类,这样我就可以让代码编写一次,然后使用两次(或更多),而不是为每个函数使用一个男性和女性对应项。以下是(一个非常简单的例子)我到目前为止所做的: class Item { public $ID, $displayDa

我最近花了一些时间重构了一个旧的个人项目,我想用它作为一种学习经验,学习如何最好地处理此类课程

问题是我的类(项目)有两种性别(将来可能更像是项目的海报,以及项目的帽子/配件),每种性别都使用几乎相同的方法来获取和设置有关它们的内容(获取产品图像、设置价格等)

我想重构这个类,这样我就可以让代码编写一次,然后使用两次(或更多),而不是为每个函数使用一个男性和女性对应项。以下是(一个非常简单的例子)我到目前为止所做的:

class Item
{
    public $ID, $displayDate;
    public $male, $female;

    public function __construct($ID)
    {
        //Fancy code to initialize stuff like $displayDate
        $male = new Gender('male', $ID, $displayDate);
        $female = new Gender('female', $ID, $displayDate);
    }
}

class Gender
{
    private $ID, $displayDate;

    public function get_currentPrice()
    {
        //The current price of the gender changes based on the display date vs the current date and then adjusts the price accordingly and returns it.
    }
}
有没有办法让我把这篇文章写得更好?我的另一个问题是,displayDate可以(也将)改变很多,所以对它的任何改变都需要传播到性别类,这将使这一切变得一团糟


如果有帮助的话,我正在使用PHP5.4,因此任何添加到PHP5.4中的新东西都可以在这里使用。

我看到了两种解决方法

一种是你把两种性别都粘在一个类上,用某种标志来区分男性/女性(例如,“类型”你计划有两种以上的性别)

另一个是使用特征


例如,您知道$displayDate总是以相同的方式进行获取/设置和处理。因此,您可以创建一个trait,比如hasDisplayDate,在其中指定属性(protected$displayDate)和所有必要的方法。而在性别中,你只需添加“use hasDisplayDate”来混合这种特质。您可以在需要时重载traits中存在的方法。

您不能使用吗Inheritance@Dave我不想使用继承的原因是我真的需要一个类来封装不同类型的项。项目中的大多数内容都是相同的,并且会半频繁地更改,因此我宁愿在一个位置更改它,也不必在两个扩展类中都更改它。创建一个容器类来存储子对象的实例及其关系如何。因此,您将拥有$useritems类,该类拥有所选择和关联的$items和$gender。或者你可以用一张清单来记录这些关系?我明白了吧?项目是一件衬衫,一件衬衫作为男模特和女模特存在?例如,如果儿童模型也存在呢?您最好有一个属性
$type
。而不是针对不同类型制作不同的实例。我认为您对这种设计非常有限。如果有疑问,请始终考虑现实世界中的对象:一件衬衫=一件物品的实例。然后你有不同的属性:id、颜色、性别(或类型)等等。有趣的是,我从来都不知道php有特征。我会投票支持你的。你能详细介绍一下特质在这里的应用吗?我读了一些关于它们的文章,但我很难理解它们是如何应用于这种情况的。我用一个简短的例子补充了一个要点:啊,这并不完全是我想要的,但它确实有助于更好地理解特质是如何起作用的。