2011-12-31 87 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'"); 
    } 

而且你必須用相同的理論來改變你的其他功能。

乾杯!