PHP:使用类对象维护会话数据

PHP:使用类对象维护会话数据,php,session,object,Php,Session,Object,我是一名PHP OOP新手,目前正在学习。我创建了一个session类,它应该检查session变量$\u session['userID']是否已设置,并将登录状态设置为true;以及设置用户id。还有一个函数,setVars(),用于在调用时设置其他对象属性: session.php <?php class Session { public $log_in_status=false; public $userID; public $fname; public $class_i

我是一名PHP OOP新手,目前正在学习。我创建了一个session类,它应该检查session变量
$\u session['userID']
是否已设置,并将登录状态设置为true;以及设置用户id。还有一个函数,
setVars()
,用于在调用时设置其他对象属性: session.php

<?php 
class Session
{
public  $log_in_status=false;
public  $userID;
public  $fname;
public  $class_id;
public  $email;

public function __construct()
{
session_start();

if ($_SESSION['userID'])
{
    $this->log_in_status = true;
    $this->userID = $_SESSION['userID'];
}
else
{
    $this->log_in_status = false;
    unset($_SESSION['userID']);             
}
}


public function setVars($classID, $email, $fname)
{
$this->class_id = $classID;
$this->email    = $email;
$this->fname    = $fname;
}
}

$session = new Session();
//--------------------------------------------

<?php
# page2.php

 require_once("init.php"); 
?>

<!DOCTYPE html>
<html>
    <head>
        <title>Testing sessions</title>
    </head>
    <body>
        <?php
            echo "Page 2 <br> <br>";
            echo "objectClassID: "   . $session->class_id . "<br>";
            echo "objectEmail  : "   . $session->email . "<br>";
            echo "objectFname  : "   . $session->fname . "<br> <br>";

            echo "<a href='page1.php'>Go to Page 1</a>";
        ?>
    </body>
</html>

测试会议

如何使page2.php能够显示
$session
对象属性?

如果要跨页面持久化变量,需要将它们存储在
$\u session
数组中。比如说

<?php 
class Session {
  public $log_in_status = false;
  public $userID;
  public $fname;
  public $class_id;
  public $email;

  public function __construct() {
    session_start();

    if (isset($_SESSION['userID'])) {
        $this->log_in_status = true;
        $this->userID = $_SESSION['userID'];
    }

    $this->class_id = isset($_SESSION['class_id']) ? $_SESSION['class_id'] : null;
    $this->email = isset($_SESSION['email']) ? $_SESSION['email'] : null;
    $this->fname = isset($_SESSION['fname']) ? $_SESSION['fname'] : null;
  }

  public function setVars($classID, $email, $fname) {
    $this->class_id = $_SESSION['class_id'] = $classID;
    $this->email = $_SESSION['email'] = $email;
    $this->fname = $_SESSION['fname'] = $fname;
  }
}

$session = new Session();

我强烈建议删除最后一行文件的结束PHP标记(即
?>
)。请参见,对于您的问题,您从未在会话中存储变量在
会话中没有OOP迹象。它是伪装成OOP的过程编程。删除
会话
类,它是无用的,直接使用
$\u Session[]
您的代码将更小、更快、更易于阅读和理解。明白了!谢谢你,我想强调一下在上面的答案中反复使用的
isset
。这将帮助您防止大量警告和运行时问题。
<?php
# page2.php

 require_once("init.php"); 
?>

<!DOCTYPE html>
<html>
    <head>
        <title>Testing sessions</title>
    </head>
    <body>
        <?php
            echo "Page 2 <br> <br>";
            echo "objectClassID: "   . $session->class_id . "<br>";
            echo "objectEmail  : "   . $session->email . "<br>";
            echo "objectFname  : "   . $session->fname . "<br> <br>";

            echo "<a href='page1.php'>Go to Page 1</a>";
        ?>
    </body>
</html>
<?php 
class Session {
  public $log_in_status = false;
  public $userID;
  public $fname;
  public $class_id;
  public $email;

  public function __construct() {
    session_start();

    if (isset($_SESSION['userID'])) {
        $this->log_in_status = true;
        $this->userID = $_SESSION['userID'];
    }

    $this->class_id = isset($_SESSION['class_id']) ? $_SESSION['class_id'] : null;
    $this->email = isset($_SESSION['email']) ? $_SESSION['email'] : null;
    $this->fname = isset($_SESSION['fname']) ? $_SESSION['fname'] : null;
  }

  public function setVars($classID, $email, $fname) {
    $this->class_id = $_SESSION['class_id'] = $classID;
    $this->email = $_SESSION['email'] = $email;
    $this->fname = $_SESSION['fname'] = $fname;
  }
}

$session = new Session();