提问人:Madara's Ghost 提问时间:11/26/2011 最后编辑:Madara's Ghost 更新时间:12/2/2011 访问量:142
如何跟踪同一用户(对象)的多个实例
How to track multiple instances of the same user (object)
问:
我正在用PHP编写一个IRC机器人,我想比大多数其他机器人更复杂一些。
我的应用程序中有以下类:
Bot
- 实际的机器人类,它处理机器人可以获得的所有功能和命令。Registry
- 全局设置和变量,传递给任何功能类,这样我就不必在全局命名空间中乱扔变量。Channel
- 定义通道对象 properties: ,其中 是通道名称,是对象数组。$name, $nicklist
$name
$nicklist
User
User
- 定义用户对象 properties: ,其中 是用户的地址,格式为 。$nickname, $fullAddress
$fullAddress
nick!user@host
然而,到目前为止,用户可能在多个渠道上,并且由于我不想拥有来自同一用户的多个对象(例如,如果用户更改了他的昵称,我将不得不更新多个元素,而不仅仅是一个)。
我该怎么做,我正在考虑在类的底部保留一个大型用户池,并将这些引用传递给通道,但我真的不知道该怎么做:PBot
谁能为我指出正确的方向?如果你愿意,我可以粘贴我当前的代码(它相当长,所以如果没有人需要它,我宁愿不这样做)。
谢谢。
答:
0赞
AlexTheo
11/26/2011
#1
您可以为您的用户添加频道 ID 列表,每次用户加入新频道时,您都会在列表中附加一个新的频道 ID,因此如果用户离开频道,您将从其列表中删除频道 ID。
评论
0赞
Madara's Ghost
11/26/2011
但关键是要跟踪频道上的用户,而不是用户频道,因为我想检查用户是否在特定频道上享有特权,并将他与该频道中的其他用户进行比较。在每个频道中创建一个用户列表,而不是在每个用户中创建一个频道列表更有意义。(虽然两者可以结合使用)
0赞
Madara's Ghost
11/26/2011
此外,它会导致同样的问题。2 个用户可以在同一个频道上,那么我必须将相同的对象提供给 2 个用户。
0赞
AlexTheo
11/26/2011
您将仅添加通道 ID,而不添加通道对象的实例。从要求来看,一个频道有很多用户,一个用户可以加入多个频道,用户也可以看到他加入的频道名称,因此用户有频道名称列表。
0赞
Madara's Ghost
11/26/2011
请注意,这不是一个 IRC 客户端,而是一个机器人。机器人应该跟踪其所在频道上的用户。用户仅作为对象携带意义,以便机器人可以判断用户是否在某个频道上,他是否是该频道上的操作人员,并且如果它在该频道上检测到他的问题,则可以禁止他进入该特定频道。为此,我不在乎用户在什么频道上,我只在乎用户在我的频道上。
0赞
Madara's Ghost
12/2/2011
#2
由于对象是需要进行跟踪的对象,因此在其上有一个对象数组,并将指向这些对象的指针(又名)传递给对象。Bot
User
$bot->users['name']
Channel
这样,如果用户列表中已经找到该用户,则可以传递同一指针两次。
评论