变量在PHP类中没有变化

时间:2016-10-05 00:33:01

标签: php class oop variables methods

该方法 - 最初在index.php中调用 - 重定向到另一个页面。这里的问题是变量$logged_in没有被分配一个新值...这意味着当该变量在另一个页面中使用时,它被读作false

注意:会话' id'和会话'键入'是对的。

class Session {    
    public $logged_in = false;
    public function login($data) {
        if ($data) {
            $_SESSION['id'] = $data['id'];
            $_SESSION['type'] = $data['type'];
            $this->logged_in = true;            
        }
    }
 }

2 个答案:

答案 0 :(得分:2)

这是一个类,因此在第一个脚本执行结束时丢失(其属性丢失),然后在第二个脚本的初始状态中重新创建。

类不会存在于同一脚本或任何其他脚本的执行中。

如果您希望维护对象状态,则必须将状态保存到文件或真实的SESSION,以便在第二个脚本启动时重新保存数据

session_start();

class Session {    

    public function login($data) {
        if ($data) {
            $_SESSION['id'] = $data['id'];
            $_SESSION['type'] = $data['type'];
            $_SESSION['logged_in'] = true;            
        }
    }

    // getter function
    public function is_logged_in()
    {
        // just in case check
        if ( isset($_SESSION['logged_in']) ) {
            return $_SESSION['logged_in'] == true;
        } else {
            return false;
        }
    }
}

像这样打电话

$s = new Session();
if ( ! $s->is_logged_in() ) {
    header('Location: index.php');
    exit;
}

要完全远离SESSION,你可以

class Session {
    public $id;
    public $type;
    public $logged_in;


    public function __construct()
    {
        if ( file_exists('my_session.txt')) {
            $obj = json_decode(file_get_contents('my_session.txt'));
            foreach($obj as $prop => $val) {
                $this->{$prop} = $val;
            }
        }
    }

    public function __destruct()
    {
        file_put_contents('my_session.txt', json_encode($this));
    }

    public function login($data) {
        if ($data) {
            $this->id           = $data['id'];
            $this->type         = $data['type'];
            $this->logged_in    = true;
        }
    }
}


$obj = new Session();
$obj->login(array('id'=>99, 'type'=>'TEST'));

print_r($obj);

$obj = null;

echo 'object nulled' . PHP_EOL;
print_r($obj);
echo ' NOTHING should be printed' . PHP_EOL;

echo 'object rehydrated' . PHP_EOL;
$obj = new Session();
print_r($obj);

答案 1 :(得分:0)

创建另一个方法check_login()以重新分配新页面中的值并在__construct()中调用它

function __construct(){
    $this->check_login();
}
public function check_login(){
    if(isset($_SESSION['id']) && isset($_SESSION['type']){
        $this->logged_in = true;
    } else {
        $this->logged_in = false;
    }
}