PHP中的位标志的最佳做法

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了PHP中的位标志的最佳做法脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
我在 PHP MysqL中编写了一个小应用程序,并且已经到了有一个对象(有一个对象(到目前为止,但预计不会增加8个))的关联点.标志几乎是无关紧要的,尽管有些组合是没有意义的.对象表示DB中的一行(有一些用于保存/加载它的方法),因此该问题也适用于选择存储方法.

问题是 – 如何在代码数据库中最好地代表他们?我可以想到几种方式:

将它们存储在数据库中的一种方法是以单位为标记的单个整数字段.在PHP方面,我可以想象几种代表它们的方法

>只需导出整数值并定义一对标志常量;让每一个需要旗帜的地方都有自己的一点魔法;
>定义类方法GetFlag(),SetFlag()和UnsetFlag(),在私有整数变量上执行按位魔法;然后将这些方法作为参数传递一个标志常量.
>定义方法GetFlagA(),GetFlagB()等(以及Set和Unset对等方);
>定义一组成员变量,每个变量表示一个标志;将它们从DB加载,并在保存时收集它们.
>创建一个成员变量,该变量是所有标志值的数组.使用预定义的常量作为数组索引来访问每个标志.还可以在加载/保存时填充/收集数组.

另一种方法是将它们作为单独的BIT字段存储在数据库中.在PHP中,然后将转换成多个成员变量. IMHO这将使查询复杂化.

最后一种方法是定义所有标志的anothed表,以及用于标记和原始对象之间多对多关系的中间表.所有的解决方案都是最笨重的,因为考虑到只有3个表格.

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

在您的 model中,该对象具有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;

幸福与阳光!

脚本宝典总结

以上是脚本宝典为你收集整理的PHP中的位标志的最佳做法全部内容,希望文章能够帮你解决PHP中的位标志的最佳做法所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。