php - 类属性不返回值

时间:2015-06-26 02:20:22

标签: php oop

我想知道我的类属性$friend_username没有返回它的值,它是公共的。

更新

class Feed {
    public static $friend_username;

    // ONLINE FRIENDS LOGIC
    public function online_friends(){
        $friendsHTML = '';
        $countOnlineFriends = '';
        if(GetFriends($GLOBALS['log_username']) != false) {
            $all_friends = GetFriends($GLOBALS['log_username']);
            $orLogic = '';
            foreach($all_friends as $key => $user){
                if(IsBlocked($GLOBALS['log_username'],$user,true) == false){
                    $orLogic .= "username='$user' OR ";
                }
            }
            $orLogic = chop($orLogic, "OR ");
            $sql = "SELECT username, avatar, logged_in FROM users WHERE ($orLogic) AND logged_in = 1";
            $query = mysqli_query($GLOBALS['db_conx'], $sql);
            $friend_loggedIn = array();
            while($row = mysqli_fetch_array($query, MYSQLI_ASSOC)) {
                $this->friend_username = $row["username"];
                $friend_avatar = $row["avatar"];
                $friend_loggedIn[] = $row["logged_in"];
                $friend_pic =  userImage($this->friend_username,$friend_avatar,'42','42',$link = false,$up = true);
                $friendsHTML .= '<li><a href="#" onClick="chatbox(\''.$this->friend_username.'\',\''.getName($this->friend_username,true).'\');return false;">'.$friend_pic.' '.getName($this->friend_username,true).'</li>';
                $countFriends = count($friend_loggedIn);
                $countOnlineFriends = ($countFriends > 0) ? '<span class="online_friends animated">'.$countFriends.'</span>' : '';
            }
        }else{
            $friendsHTML = 'No friends';
        }
        return "$countOnlineFriends|$friendsHTML";
    }

    public function update_chat() {
        $id = '';
        $messages = '';
        $randUser = '';
        $user = sanitize($this->friend_username);
        $sql = "SELECT * FROM pm_chat WHERE (sender='$GLOBALS[log_username]' AND receiver='$user') OR (sender='$user' AND receiver='$GLOBALS[log_username]') ORDER BY datetime DESC";
        $result = mysqli_query($GLOBALS['db_conx'],$sql) or die(mysqli_error($GLOBALS['db_conx']));
        while ($row = mysqli_fetch_assoc($result)) {
            $id = $row['id'];
            $user1 = $row['sender'];
            $user2 = $row['receiver'];
            $message = parseData($row['message']);
            $did_read = $row['did_read'];
            $datetime = $row['datetime'];
            if ($user1 != $GLOBALS['log_username']) {
                $randUser = $user1;
            }elseif ($user2 != $GLOBALS['log_username']) {
                $randUser = $user2;
            }
            if ($user1 == $GLOBALS['log_username'] && $user2 != $GLOBALS['log_username']) {
                $messages .= '<li class="row" id="pm_row_'.$id.'"><div class="me">'.$message.'</div></li>';
            }else{
                $messages .= '<li class="row" id="pm_row_'.$id.'">'.userImage($randUser,getAvatar($randUser),28,28,$link = true,$up = true).'<div class="userfrnd">'.$message.'</div></li>';
            }
        }
        return $this->friend_username."$id|$messages|$randUser";
        // this is for ^^^^^^^ testing  purpose
    }
}

这是我调用其他类方法的另一个文件。它的content-typetext/event-stream

class update_chat extends SSEEvent {
    public function update(){
        //Here's the place to send data
        $feed = new Feed();
        return $feed->update_chat();
    }
    public function check(){
        //Here's the place to check when the data needs update
        return true;
    }
}

为什么这个问题仍然存在的任何想法或建议?

提前感谢。

2 个答案:

答案 0 :(得分:4)

如果您在另一个文件中调用bar(),然后在Foo中创建新的otherClass,则表示您没有引用Foo的同一个实例。要使$friend_username静态并静态调用

public static $friend_username;

public function update(){
    //Here's the place to send data
    return Foo::$friend_username;
}

或至少使函数静态

public static function bar() {}

public function update(){
    //Here's the place to send data
    return Foo::bar();
}

或将Foo的实例传递给函数

public function update(Foo $Foo){
    //Here's the place to send data
    return $Foo->bar();
}

如果要在同一个类中调用静态方法,则必须使用self标识符(self::$var

    class Feed {
    public static $friend_username = array();

    // ONLINE FRIENDS LOGIC
    public function online_friends(){
        $friendsHTML = '';
        $countOnlineFriends = '';
        if(GetFriends($GLOBALS['log_username']) != false) {
            $all_friends = GetFriends($GLOBALS['log_username']);
            $orLogic = '';
            foreach($all_friends as $key => $user){
                if(IsBlocked($GLOBALS['log_username'],$user,true) == false){
                    $orLogic .= "username='$user' OR ";
                }
            }
            $orLogic = chop($orLogic, "OR ");
            $sql = "SELECT username, avatar, logged_in FROM users WHERE ($orLogic) AND logged_in = 1";
            $query = mysqli_query($GLOBALS['db_conx'], $sql);
            $friend_loggedIn = array();
            while($row = mysqli_fetch_array($query, MYSQLI_ASSOC)) {
                array_push(self::$friend_username, $row["username"]);
                $friend_avatar = $row["avatar"];
                $friend_loggedIn[] = $row["logged_in"];
                $friend_pic =  userImage(self::$friend_username,$friend_avatar,'42','42',$link = false,$up = true);
                $friendsHTML .= '<li><a href="#" onClick="chatbox(\''.self::$friend_username.'\',\''.getName(self::$friend_username,true).'\');return false;">'.$friend_pic.' '.getName(self::$friend_username,true).'</li>';
                $countFriends = count($friend_loggedIn);
                $countOnlineFriends = ($countFriends > 0) ? '<span class="online_friends animated">'.$countFriends.'</span>' : '';
            }
        }else{
            $friendsHTML = 'No friends';
        }
        return "$countOnlineFriends|$friendsHTML";
    }

    public function update_chat() {
        $id = '';
        $messages = '';
        $randUser = '';

        $user = Feed::$friend_username;
        foreach ($user as $key => $value) {
            $user[$key] = sanitize($value);
        }

        //I leave it up to you to figure out how you want to deal with the array of users in this next line
        $sql = "SELECT * FROM pm_chat WHERE (sender='$GLOBALS[log_username]' AND receiver='$user') OR (sender='$user' AND receiver='$GLOBALS[log_username]') ORDER BY datetime DESC";
        $result = mysqli_query($GLOBALS['db_conx'],$sql) or die(mysqli_error($GLOBALS['db_conx']));
        while ($row = mysqli_fetch_assoc($result)) {
            $id = $row['id'];
            $user1 = $row['sender'];
            $user2 = $row['receiver'];
            $message = parseData($row['message']);
            $did_read = $row['did_read'];
            $datetime = $row['datetime'];
            if ($user1 != $GLOBALS['log_username']) {
                $randUser = $user1;
            }elseif ($user2 != $GLOBALS['log_username']) {
                $randUser = $user2;
            }
            if ($user1 == $GLOBALS['log_username'] && $user2 != $GLOBALS['log_username']) {
                $messages .= '<li class="row" id="pm_row_'.$id.'"><div class="me">'.$message.'</div></li>';
            }else{
                $messages .= '<li class="row" id="pm_row_'.$id.'">'.userImage($randUser,getAvatar($randUser),28,28,$link = true,$up = true).'<div class="userfrnd">'.$message.'</div></li>';
            }
        }
        return Feed::$friend_username."$id|$messages|$randUser";
        // this is for ^^^^^^^ testing  purpose
    }
}

答案 1 :(得分:0)

好吧,既然您正在使用方法 mysqli_fetch_array ,那么是否可以返回多个元素并且最后一个元素为空?

顺便说一句,我不明白你为什么要在while语句中创建单个变量归因。据说,最后一次运行(如果有的话)将覆盖变量的值。

关于第二个代码的另一个观察。如果您正在立即调用 bar()方法,那么该变量是否仍为空?我了解 $ friend_username 仅在 foo()方法中指定。