Session类构造函数中的session_start()(是否在每个URL上启动多个会话)

时间:2019-02-01 11:49:04

标签: php session-cookies

  • session_start()方法位于Session.php类的构造函数中

  • 每个页面标题中都需要Session.php类 (require_once('Session.php'))

这意味着当我重定向到另一个URL并每次启动新的会话时,将再次包含Session类。这将导致错误。

但是这段代码正常工作,为什么?

class Session {
    private $signed_in = false;
    public $user_id;
    private $is_admin;
    public $message;
    public $count;

    function __construct() {

        session_start();
        $this->visitor_count();
        $this->check_the_login();
        $this->check_message();
    }

} //End of Session Class

$session = new Session();

为什么我应该在每次Session类初始化时开始新的会话

2 个答案:

答案 0 :(得分:2)

您的问题是在代码中间调用session_start:

http://php.net/manual/en/function.session-start.php

  

注意:

     

要使用基于cookie的会话,必须在调用session_start()之前   将任何内容输出到浏览器。

请尝试将其放在文件开头,类声明之前或其他include中。

答案 1 :(得分:0)

我将从session_start命令(听起来很傻,但熊)解耦会话类,以避免调用它的posiblity变得迷茫和/或福尔戈和/或在错误的时间调用(头后)。

如果您不使用框架,我可以假设你不是因为您选择处理会话直,那么我可能会选把session_start调用在自定义自动加载文件加载在开始这每个请求。

类似这样的东西(假设您使用作曲家的自动排版机)

<强> custom_autoload.php

<?php
    session_start();

    $loader = require __DIR__ . '/relative/path/to/vendor/autoload.php';

您知道这样,它的任何输出到浏览器之前被调用。然后,您的会话类可以负责处理$_SESSION的内容,这应该是它的单项工作。

如果您不熟悉作曲家自动加载器,请参见this问答,以获取有关使用作曲器自动加载器的良好指导。