2011-12-31 7 views
0

je les suivantes classe "étudiant":PHP POO: Accès aux variables

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'"); 
    } 
} 

Je suis en train de faire:

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

Mais je obtiens l'erreur suivante:

Fatal erreur: Utilisation de $ this dans un contexte d'objet dans /Applications/MAMP/htdocs/flight1/phpincludes/classes/students.class.php à la ligne 54

+0

Où est la ligne 54? – deceze

+4

Remarque - n'utilisez pas 'global' pour accéder à la ressource' $ db'. Passez-le comme un argument à la méthode, ou (* aussi probable que vos méthodes statiques deviendront des instances, basées sur les réponses ici *) passez-le au constructeur de l'objet. – Dan

Répondre

1

Vous obtenez cette erreur car votre fonction est une fonction statique, et par conséquent vous ne pouvez pas utiliser le pointeur $this car il est supposé pointer vers un objet. Il suffit donc de supprimer le mot-clé static de vos définitions de fonction.

0

Supprimez le mot-clé static des fonctions que vous avez déclarées dans votre classe Student.

Le mot-clé static est simplement utilisé pour indiquer une fonction accessible sans avoir besoin de créer une instance de cette classe. D'autre part, $this est utilisé pour faire référence aux variables d'instance de classe. C'est pourquoi ces deux ne vont pas bien ensemble, vous essayez d'accéder à une variable d'instance (en utilisant $this) dans un contexte statique.

1

Vous utilisez des méthodes statiques de manière non statique. Les méthodes statiques sont uniquement liées à sa classe, mais pas à un objet, donc $this n'est pas disponible. Cela signifie notamment que $this->userid, que vous utilisez dans getCoursesByInstructor(), n'est pas valide. Je recommande de rendre la méthode non statique.

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

Le problème avec votre code est que vous demandez $this dans votre fonction statique. Regarde ça. Vous avez $ this-> user_id dans la requête.

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'"); 

Pour résoudre ce problème, vous devez modifier cette fonction. Je peux vous suggérer la manière suivante.

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'"); 
    } 

Et vous devez changer vos autres fonctions avec la même théorie.

À la votre!