在Doctrine and mySQL Enum,我读到了:
Mysql Enums
Doctrine 2的类型系统由flyweights组成,意思是 只有一个任何给定类型的实例。另外类型呢 不包含国家。这两种假设都使它变得相当复杂 使用Enum Type of MySQL
我会喜欢外行语言解释它意味着什么。感谢。
答案 0 :(得分:3)
Doctrine 2的类型系统由flyweights组成,意思是 只有一个任何给定类型的实例。
Flyweight类创建不可变的值对象。因此,他们以这种方式与字符串类似,即
$String = "myString";
这将创建一个无法更改的String对象。对此的任何更改都会导致新的String对象。 Flyweight类的相似之处在于,一旦通过构造函数创建了新对象,它就无法更改,并且它具有相同的值。但是,Flyweight类最终比使用字符串更容易消耗。
https://en.wikipedia.org/wiki/Flyweight_pattern在一个较大的CoffeeShop实现中使用Flyweight类CoffeeFlavour的几种语言中的示例有一些很好的例子。这是一个应该是PHP的例子,我很快就嘲笑了:
<?php
class CoffeeFlavour {
private $name;
function __construct(String newFlavor) {
$this->name = newFlavor;
}
public __toString() {
return $this->name;
}
}
所以CoffeeFlavour的每个实例都是它自己的CoffeeFlavour,用于订单等。
此外,类型不包含状态。
详细说明上述内容:与字符串类似,Flyweight类不能更改实例。一旦它被构建,它就是它。所以在上面的例子中,String&#34; myString&#34;就是这样。字符串中的任何更改都将导致创建新对象。
要使用CoffeeFlavour的例子,改变咖啡的味道会非常荒谬!这就是您没有看到setName()方法的原因。换句话说,请参阅以下内容:
$caffeineCoffee = new CoffeeFlavour("Caffeinated");
$decafCoffee = new CoffeeFlavour("Decaf");
你不能说'&#34;状态&#34;咖啡因的一个突然变成了脱咖啡因。你会创建一个新的不同的饮料。这增加了它们的不变性。
当我订购饮料时,我说:$myDrink = $caffeineCoffee;
因此引用羽量级的对象。这些物品没有状态,它们就是,它们是什么。
另一方面,MySQL有一个列(类型),根据值列表,它具有状态。所以这直接与学说2的方法论相冲突。以下进一步阐述。
两种假设都使得使用Enum变得相当复杂 MySQL的类型
根据MySQL的文档https://dev.mysql.com/doc/refman/5.0/en/enum.html页面:
ENUM是一个字符串对象,其值从允许值列表中选择,这些值在表创建时在列规范中显式枚举。
在这种情况下,MySQL列(类型)包含一个状态(它拥有哪个允许值)。这些是在创建表时确定的,并且允许值的任何更改都需要删除并重建表。但是,Flyweight类(如上所述)很容易根据需要添加新实例。 Flyweight类的每个类型(实例)都是唯一的,不可变的。
总结如下:
希望这能回答你的问题!