该方法 - 最初在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;
}
}
}
答案 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;
}
}