当前位置:  开发笔记 > 编程语言 > 正文

PHP中位标志的最佳实践

如何解决《PHP中位标志的最佳实践》经验,为你挑选了1个好方法。

我在PHP + MySQL中编写了一个小应用程序,并且已经达到了一个对象,它有一对(有8个到目前为止,但没有预料到会增加)与之关联的标志.这些标志几乎没有关系,尽管有些组合没有任何意义.该对象表示DB中的一行(也有一些用于保存/加载它的方法),因此该问题也适用于选择存储方法.

问题是 - 如何在代码和数据库中最好地代表它们?我可以想到几种方法:

将它们存储在DB中的一种方法是在单个整数字段中作为按位标志.在PHP方面,我可以想象几种表示方式:

只需导出整数值并定义几个标志常量; 让每个需要旗帜的地方都有自己的魔法;

定义类方法GetFlag(),SetFlag()并对UnsetFlag()私有整数变量执行按位魔术; 然后将这些方法作为参数传递给其中一个标志常量.

定义方法GetFlagA(),GetFlagB()等.(与设置和取消对应沿);

定义一组成员变量,每个变量代表一个标志; 在从DB加载时设置它们并在保存时收集它们.

创建一个成员变量,它是所有标志值的数组.使用预定义常量作为数组索引来访问每个标志.在加载/保存时填充/收集数组.

另一种方法是将它们作为单独的BIT字段存储在DB中.在PHP中,然后将转换为几个成员变量.恕我直言,这会使查询复杂化.

最后一种方法是为所有标志定义一个anothed表,并为标志和原始对象之间的多对多关系定义一个中间表.恕我直言,所有解​​决方案中最混乱的,考虑到只有3个表,否则.

我没有做太多的PHP开发,所以我不知道最佳实践是什么.在C#中,我可能会将它们存储为按位标志,并使属性在私有整数上执行按位魔术.但PHP没有属性(我使用最新的稳定版本)...



1> Preston..:

在你的模型中,该对象具有8个布尔属性.这意味着数据库表中有8个布尔(TINYINT for MySQL)列,对象中有8个getter/setter方法.简单而传统.

重新思考你目前的做法.想象一下,下一个必须维护这件事的人会说些什么.

CREATE TABLE mytable (myfield BIT(8));

好的,看起来我们将在这里发生一些二进制数据.

INSERT INTO mytable VALUES (b'00101000');

等等,有人再次告诉我这些1和0中的每一个代表什么.

SELECT * FROM mytable;
+------------+
| mybitfield |
+------------+
| (          | 
+------------+

什么?

SELECT * FROM mytable WHERE myfield & b'00101000' = b'00100000';

WTF!?WTF!?

刺伤自己的脸


- 同时,在另一个宇宙中,仙女与独角兽玩耍,程序员不讨厌DBA ... -

SELECT * FROM mytable WHERE field3 = 1 AND field5 = 0;

幸福和阳光!


我很快就看到了这个主题最幽默的答案.谢谢你的笑声,有一个upvote.
推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有