2011-07-19 6 views
-1

Je n'ai pas beaucoup d'expérience avec la programmation OOP en PHP, et ma recherche n'a donné aucun résultat mais des solutions aux méthodes directes. Ce que je dois est le suivant:Appel de méthode dynamique dans POO

// URL Decides which controller method to load 
$page = $_GET['page']; 

// I want to load the correct controller method here 
$this->$page(); 

// A method 
public function home(){} 

// Another method 
public function about(){} 

// e.g. ?page=home would call the home() method 

EDIT: J'ai essayé plusieurs des suggestions, mais ce que je reçois un message d'erreur de surcharge de la mémoire. Voici mon code complet:

<?php 

class Controller { 

    // Defines variables 
    public $load; 
    public $model; 

    public function __construct() { 

     // Instantiates necessary classes 
     $this->load  = new Load(); 
     $this->model = new Model(); 

     if (isset($_GET['page'])) { 

      $page = $_GET['page']; 

      $fc = new FrontController; // This is what crashes apparently, tried with and without(); 

     } 

    } 

} 
+2

L'avez-vous essayé? – netcoder

Répondre

0

Vous pouvez appeler les propriétés dynamiques et des méthodes en utilisant quelque chose comme ceci:

$this->{$page}(); 
0

Utilisez une classe.

Class URLMethods { 
    public function home(){ ... } 
    public function about(){ ... } 
} 

$requestedPage = $_GET['page']; 

$foo = new URLMethods(); 
$foo->$requestedPage(); 
+0

mais autoriser les variables url à contrôler le flux est une idée terrible en raison de la sécurité, etc. Si vous avez l'intention de le faire, assurez-vous de désinfecter (vérifier explicitement les valeurs autorisées) la variable GET. –

3

Si je comprends bien votre question, vous auriez probablement voulez quelque chose de plus comme ceci:

class FrontController { 
    public function home(){ /* ... */ } 
    public function about(){ /* ... */ } 
} 

$page = $_GET['page']; 
$fc = new FrontController; 
if(method_exists($fc, $page)) { 
    $fc->$page(); 
} else { 
    /* method doesn't exist, handle your error */ 
} 

Est-ce que vous cherchez? La page examinera la variable $ _GET ['page'] entrante et vérifiera si votre classe FrontController a une méthode nommée $ _GET ['page']. Si oui, il sera appelé; Sinon, vous devrez faire autre chose à propos de l'erreur.

-1

Vous pouvez y parvenir en utilisant call_user_func. Voir aussi How do I dynamically invoke a class method in PHP?

Je pense que vous souhaitez également ajouter une autre chaîne aux fonctions appelables comme ceci:

public function homeAction(){} 

afin d'empêcher un pirate d'appeler des méthodes que vous ne voulez probablement pas être .

+0

Pourquoi ne pas simplement rendre ces méthodes privées? – Ryan

+0

Juste au cas où vous devriez appeler cette méthode d'une autre classe. Quoi qu'il en soit, votre question de commentaire est subjective et c'est ainsi que ZendFramework le fait réellement, donc je pense qu'il y a vraiment une certaine logique à faire cela. – s3v3n

+0

Et depuis quand une sécurité supplémentaire est inutile? – s3v3n