间接修改重载属性

时间:2010-12-28 00:26:45

标签: php arrays oop session

我正在创建一个论坛,我想跟踪自上次访问用户以来哪些线程已更新。所以我有一个数组,我保留在$ _SESSION中,基本上结构为[$boardid][$threadid] = 1。如果设置了threadid和boardid,则表示尚未读取该线程,并且该板包含未读线程。当用户查看线程时,我只需unset()相应的板和线程ID。但是,我遇到了无法使用这样的数组的问题。

首先,我有一个会话类来处理会话数据更好

class Session {
private $_namespace;

public function __construct($namespace = '_default') {
    $this->_namespace = $namespace;
}

/**
 * Erase all variables in the namespace
 */
public function clear() {
    unset($_SESSION[$this->_namespace]);
}

public function __set($name, $value) {
    $_SESSION[$this->_namespace][$name] = $value;
}

public function __get($name) {
    if(isset($_SESSION[$this->_namespace]) && array_key_exists($name, $_SESSION[$this->_namespace])) {
        return $_SESSION[$this->_namespace][$name];
    }

    return null;
}

public function __isset($name) {
    return isset($_SESSION[$this->_namespace][$name]);
}


public function __unset($name) {
    unset($_SESSION[$this->_namespace][$name]);
}

};

然后我有一个表示当前用户的CurrentUser类。 CurrentUser类有一个名为_data的成员,它是一个Session对象。在CurrentUser类中,我重写__get和__set方法以使用_data成员。

    public function __set($name, $value) {
    $this->_data->$name = $value;
}

public function __isset($name) {
    return isset($this->_data->$name);
}

public function __get($name) {
    if(isset($this->_data->$name)) {
        return $this->_data->$name;
    }

    return null;
}

现在要跟踪哪些线程未读,我获取日期为> =用户的last_seen日期的所有线程。我也有方法从数组中删除板和线程。

    public function buildUnreadList($since) {
    // Build a "new since last visit" list
    $forumModel = new Model_Forum();
    $newThreads = $forumModel->fetchThreadsSinceDate($since);
    foreach($newThreads as $thread) {
        $tmp =& $this->unreadThreadsList;
        $tmp[$thread['board']][$thread['id']] = 1;              
    }
}
public function removeThreadFromUnreadList($boardid, $threadid) {
    $threads =& $this->unreadThreadsList;
    unset($threads[$boardid][$threadid]);   
}

public function removeBoardFromUnreadList($boardid) {
    $threads =& $this->_data->unreadThreadsList;
    unset($threads[$boardid]);
}

这是我遇到问题的地方。我在Indirect modification of overloaded property Session::$unreadThreadsList has no effect上收到$threads =& $this->_data->unreadThreadsList;错误如何解决此问题或设计更好的解决方案?我想创建一个跟踪数组的类,所以我不必拥有一个数组数组的数组,但我不确定持久化对象和创建一个对象只是为了管理一个数组感觉真的很脏对我来说。

1 个答案:

答案 0 :(得分:0)

对不起,如果我有点偏离基地;我试图了解变量的使用方式(因为它们的初始化没有显示)。所以$ this-> unreadThreadsList是索引的数组(如果值设置为1)。为什么不直接设置一切?

看看你在做什么,这是我的想法。它做了同样的事情,但只是对$ this-> unreadThreadsList做了一些额外的检查,它直接访问变量。

假设我正确地计算了数组结构,这应该可行。

 public function buildUnreadList($since) {
    // Build a "new since last visit" list
    $forumModel = new Model_Forum;
    $newThreads = $forumModel->fetchThreadsSinceDate($since);
    foreach($newThread as $thread)
    {
        // Avoid an error if no list pre-exists
        if(is_array($this->unreadThreadsList))
            if(array_key_exists($thread['board'],$this->unreadThreadsList))
                if(array_key_exists($thread['id'],$this->unreadThreadsList[$thread['board']]))
                    // Skip this result, already in
                    if($this->unreadThreadsList[$thread['board']][$thread['id']] == 1) continue;
        $this->unreadThreadsList[$thread['board']][$thread['id']] = 1;
    }
 }

这假设一个数组结构,如:

array(
    1 => array(
      'board' => 1,
      'id' => 2
    ),
    2 => array(
      'board' => 3,
      'id' => 1
    ),
    3 => array(
      'board' => 7,
      'id' => 2
    ));

为“fetchThreadsSinceData($ since)”的结果和

的数组结构
 array(
    1 => array(
      2 => 1
    ),
    2=> array(
      2 => 1
    ),
    3=> array(
      2 => 1
    ));

表示$ this-> unreadThreadsList,其中第一个索引是棋盘,第二个索引是线程ID。

对于其他功能,为什么不直接取消它们呢?

unset($this->unreadThreadsList[$boardid][$threadid]);
unset($this->unreadThreadsList[$boardid]);
祝你好运!
丹尼斯M。