2011-12-31 89 views
0

我有以下的 “学生” 类:PHP OOP:访问变量

class Student { 
    public $user_id; 
    public $name; 

    public function __construct($user_id) { 
     $info = $this->studentInfo($user_id); 
     $this->name = $info['name']; 
     $this->is_instructor = $info['is_instructor']; 
     $this->user_id = $info['id']; 
    } 

    public static function studentInfo($id) { 
     global $db; 

     $u = mysql_fetch_array(mysql_query("SELECT * FROM $db[students] WHERE id='$id'")); 
     if($u) { 
      return $u; 
     } 
    }   

    public static function getCoursesByInstructor() { 
     global $db; 

     return mysql_query("SELECT courses.*, course_types.name FROM $db[courses] as courses 
          JOIN $db[course_types] as course_types ON courses.course_type_id=course_types.id 
          WHERE instructor_id='$this->user_id'"); 
    } 
} 

我试图做的事:

$u = new Student(1); 
$courses = $u->getCoursesByInstructor(); 

,但我得到以下错误:

致命错误:使用$ this,当不在对象上下文中的/Applications/MAMP/htdocs/flight1/phpincludes/classes/students.class.php上54行

+0

54是哪里? – deceze 2011-12-31 00:59:59

+4

注 - 不要使用'global'来访问'$ db'资源。将它作为参数传递给方法,或者(*可能你的静态方法将成为实例,根据这里的答案*)将它传递给对象的构造函数。 – Dan 2011-12-31 01:02:48

回答

1

因为你的功能是一个静态函数,所以你不能使用它内部的指针,因为它应该指向一个对象。因此,只需从您的函数定义中删除static关键字。

0

从您在Student类中声明的函数中删除static关键字。

static关键字简单地说就是用来表示一个可以访问而不需要创建该类的实例的函数。另一方面,$this用于引用类实例变量。这就是为什么这两个不能很好地工作,你正试图在静态上下文中访问一个实例变量(通过使用$this)。

1

您正在非静态地使用静态方法。静态方法只绑定到它的类,但不绑定到对象,因此$this不可用。这尤其意味着,您在getCoursesByInstructor()中使用的$this->userid无效。我建议使该方法非静态。

public function getCoursesByInstructor() { /* your code here */ } 
0

您的代码问题是您在静态函数中请求$this。看到这个。你在查询中有$ this-> user_id。

return mysql_query("SELECT courses.*, course_types.name FROM $db[courses] as courses 
          JOIN $db[course_types] as course_types ON courses.course_type_id=course_types.id 
          WHERE instructor_id='$this->user_id'"); 

要解决此问题,您必须修改此功能。我可以按照以下方式建议你。

public static function getCoursesByInstructor($userID) { 
     global $db; 

     return mysql_query("SELECT courses.*, course_types.name FROM $db[courses] as courses 
          JOIN $db[course_types] as course_types ON courses.course_type_id=course_types.id 
          WHERE instructor_id='$userID'"); 
    } 

而且你必须用相同的理论来改变你的其他功能。

干杯!