PHP - 使用__construct()检查是否存在会话。

4
我有一个类,其中包含多个与用户数据相关的查询到数据库中,要访问这些方法需要验证用户是否已登录,我使用php初始化器 "__construct()" 方法来实现,如果用户已登录,则在那里指定。
<?php
class User() 
{
    public function __construct() {

        if ( !isset($_SESSION['user']) ) {
            $data = array(
                'response' => false,
                'message'   => 'You must login to access this page'.
            );
            echo json_encode($data);
        }
    }

    public function index() {
        // The user can access if you are logged
    }

    public function edit_profile()  {
        // The user can not access if you have not logged
    }

    public function save_profile_data() {
        // The user can not access if you have not logged
    }
}
?>

我的问题:

  1. 使用__construct()是一个好的优化选择吗?会消耗资源吗?
  2. __construct()的使用是安全的,并且可以防止用户访问其他未指定是否有编码会话变量的方法。

例如,如果用户调用edit_profile()方法,而此方法没有代码来检查会话,但我已在__construct()中指定,则用户可以访问此方法吗?


1
看起来你在这里刚开始学习PHP。好的,可能最好的方法是在类中声明一个 private 属性,用于设置执行方法权限的标志。然后在每个方法内部,您都可以检查此标志的状态,以确定是否允许执行。 - MarkSkayff
$_SESSION 拼写有误。 - Richard Theobald
@MarkSkayff - 谢谢你的回答,但是如果你在可用性方面看到了一些技术含量较高的内容,因为我想要的不是在其他方法中生成大量代码,所以我们在__construct()中进行了指定。 - Learning and sharing
@MarkSkayff 这个问题在第二次编辑中已经被纠正了。 - Richard Theobald
1
@MarkSkayff 类的构造函数的整个目的是初始化状态(即注入依赖项)。在那里执行计算既不利于测试也不利于调试,这是一种不好的做法。 - Yang
显示剩余6条评论
1个回答

2
我建议您在库文件夹中创建自己的库文件。以下是类文件。
class Authenticate {
    var $table;
    public function __construct()
    {
        $this->ci =& get_instance();

    }
  public function is_logged_in()
    {
        $sessionid = $this->ci->session->userdata('moderId');
        if($sessionid)
        {
        return isset($sessionid);
        }
         else if(!$sessionid) {
      redirect(base_url() . 'moderator');
 }
    }
}

在您的控制器中,使用此函数。如果您将此函数放在控制器的构造函数中,则它将对所有方法可用。

控制器
class B2bcategory extends CI_Controller {

    function __construct() {
        parent::__construct();

        $this->load->model('moderator/b2bcategory_model');

        $this->authenticate->is_logged_in();
    }
}

优秀的@Angel,非常感谢,已经明白了,我们可以使用构建器来检查会议,感谢您的支持,祝您愉快。 - Learning and sharing
非常感谢您对我的赞美...我很高兴能够帮助人们。祝你也有美好的一天。 - Angel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接