首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >存储模式的PHP类

存储模式的PHP类
EN

Stack Overflow用户
提问于 2014-12-09 19:41:44
回答 5查看 2.4K关注 0票数 6

我对使用OOP管理商店物品的系统的设计有疑问。我创建了具有属性$name和$price的抽象类Product。后来,我创建了扩展产品的Smartphone类。Smartphone具有$brand和$os属性。后来,我创建了扩展Product $cpuFrequency和$ram属性的类计算机。现在,如果我想创建一个对应于Nexus 5的对象,那么我必须做什么呢?例如,考虑到这个对象将具有

代码语言:javascript
复制
$name = "Nexus 5"
$price = "250"
$brand = "LG"
$os="Android"
$cpuFrequency "2.0"
$ram = "2".

这里是一个类的例子。

代码语言:javascript
复制
abstract class Product {
    private $name;
    private $price; 
    //more methods
}

class Smartphone extends Product{
    private $brand;
    private $os;    
}

class Computer extends Product {
    private $cpuFrequency;
    private $ram;   
}

还有可能是没有$os的电脑和没有$ram的智能手机。仅举一个例子:d

我知道智能手机是一台电脑。我做了个坏例子。请在电话和电脑上思考。电话有$number和$operator。现在,我想创造一个智能手机,是同时电话和电脑。

谢谢大家,再次为我的英语感到抱歉

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-12-09 19:59:38

您可以尝试使用如下所示的ProductProperties类:

代码语言:javascript
复制
class ProductProperties
{
    private properties = array();

    public function getProperties()
    {
        return this->properties;
    }

    public function addProperty($id, $value)
    {
        this->properties[$id] = $value;
    }

    public function getProperty($id)
    {
        return this->properties[$id];
    }
}

abstract class Product
{
    private $properties;
    //more methods

    public function __construct(ProductProperties $properties)
    {
        $this->properties = $properties;
    }
}

您可以将类ProductProperties的对象传递给任何产品,并让它处理所有与属性相关的问题。这将使设计更加灵活,这样您就不需要仅仅因为产品有一组不同的属性就将其子类化。记住,子类是关于改变或添加行为的。

票数 1
EN

Stack Overflow用户

发布于 2014-12-09 19:55:52

通常,您应该以“子”类初始化超类的某种方式为类编写构造函数,以保持所有内容的一致性。

代码语言:javascript
复制
abstract class Product {
    private $name;
    private $price; 
    //more methods

    public __construct($name, $price){
        $this->name = $name;
        $this->price =$price;
    }
}

class Smartphone extends Product{
    private $brand;
    private $os;
    // default value to $os: like that, we can create a Smartphone whitout an os
    public __construct($name, $price, $brand, $os = null){
        parent::__construct($name, $price);
        $this->brand = $brand;
        $this->os =$os;
    }
}

class Computer extends Product {
    private $cpuFrequency;
    private $ram;
    // default value to $ram: with this, we can create a Computer whiout ram
    public __construct($name, $price, $frequency, $ram = null){
        parent::__construct($name, $price);
        $this->frequency = $frequency;
        $this->ram =$ram;
    }

}

然后,要创建一台计算机,您可以为

代码语言:javascript
复制
$computer = new Computer('notBuiltToWindows', 560 , 2.0, 4);

或者,在您的示例中创建Nexus:

代码语言:javascript
复制
$nexus = new Smartphone($name, $price, $frequency, $ram);

并且,要创建一个智能手机,就可以将一个ram白化

代码语言:javascript
复制
$nexus = new Smartphone($name, $price, $frequency);
票数 2
EN

Stack Overflow用户

发布于 2014-12-09 19:48:34

就像其他人说的那样,让太多的课程变得混乱。

这样做的目的是创建一个可以涵盖许多不同场景的类,而不需要做太多的工作。

例如,您可以有一个类Pet。狗是宠物,蛇也是.这并不意味着您应该创建一个FourLeggedNolegs类。

就像您的产品一样,您可能有一个product类,它保存所有产品所共有的东西。您甚至可能希望有一个名为electronics的子类,它可以涵盖从电话到计算机的所有内容。

您可能有一个productType属性来说明它是什么样的电子产品(例如电话),但最终,不同的电子产品之间不会有太大的差异:电视、智能手机和计算机都有屏幕规格,智能手机和计算机都有内存、cpu等。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27387421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档