课堂下的课程

时间:2011-07-20 22:10:26

标签: php

你好,我只是坚持语法,任何人都可以帮助我使用下一个代码吗?

class User {    
  protected $userID = preg_replace('#[^0-9]#i', '', $_SESSION['user_id']);
  protected $useremail = preg_replace('#[^A-Za-z0-9@_.-]#i', '', $_SESSION['user']);
  protected $userPassword = preg_replace('#[^A-Za-z0-9]#i', '', $_SESSION['user_password']);

  public function CheckUserLogin(){     
    if(!isset($_SESSION['user'])){
      header("location: login.php");
      exit();    
    }

    //Try to find user from session data in database
    $sql = "SELECT * FROM users WHERE id = '$this->userID' AND email = '$this->useremail' AND password = '$this->userPassword' LIMIT 1";
    $res = mysql_query($sql) or die(mysql_error());
    $userMatch = mysql_numrows($res);
    if ($userMatch == 0) {
      header("location: login.php");
      exit();
    }
  }
}

2 个答案:

答案 0 :(得分:4)

首先,请注意,在声明属性时,不能为其分配一个在编译时不知道的值 - 这意味着您无法调用函数来初始化属性。

此代码:

protected $userID = preg_replace('#[^0-9]#i', '', $_SESSION['user_id']);

无效。


作为参考,您可以阅读手册的Properties页面(引用相关句子):

  

使用其中一个关键字publicprotected定义它们,   或private,然后是正常的变量声明。

这   声明可能包括初始化,但此初始化   必须是一个恒定值 - 也就是说,它必须能够被评估   在编译时,不得依赖于运行时信息   待评估。


您应首先申报该财产;并且,稍后(例如,在您班级的constructor中),初始化它:

class User {

    protected $userID;

    public function __construc() {
        $this->userID = preg_replace('#[^0-9]#i', '', $_SESSION['user_id']);
    }
}

答案 1 :(得分:1)

简而言之:您只能为类声明中的属性指定常量表达式(在类体内,但在方法之外)。其他所有内容(变量,函数调用,......)仅限于代码块(主,函数和方法)。

然而,你的代码以你展示它的方式是非常神奇的,在任何情况下都应该避免。请改用构造函数

class User {    
  protected $userID;
  protected $useremail;
  protected $userPassword;

  public function __construct ($userId, $user, $password) {
    $this->userID = preg_replace('#[^0-9]#i', '', $userId);
    $this->useremail = preg_replace('#[^A-Za-z0-9@_.-]#i', '', $user);
    $this->userPassword = preg_replace('#[^A-Za-z0-9]#i', '', $password);
  }

  // ..
}