Bonjour!
Besoin d'aide, je m'entraine sur MVC en php, ce dernier temps, je suis en train de suivre un cours sur youtub de live coding sur le MVC. Pendant le cours, j'essayais d'appliquer les mêmes codes, mais trop souvent je rencontrais de soucie et parfois j'arrivais à trouver la solution avec le peu de connaissance que j'ai déjà de la POO en php sauf que cette fois ci, je suis bloqué et ça m'empêche de progressser. selon la structure de live coding dans ce cours, c'est de réaliser une structures des URL comme celle-ci : http://url_du_site/controller/action. Cette idée me plaît beaucoup et j'aimerai bien la comprendre pour me permettre à réaliser mes applications de la sorte sauf que j'ai été bloqué et je ne sais pas à qui d'autre poser la question si ce n'est que de venir ici pour que les Ir m'aident à trouver la solution. Alors, selon la structure de l'application, il dispose d'un dossier app qui comprend deux fichiers (Controller.php et Model.php), d'un dossier controller (Articles.php), d'un dossier model (Article.php) et d'un fichier index.php qui se trouve sur la racine du site et d'un autre fichier .htaccess
le fichier index.php est considéré comme l'autholoader et voici comment il se comporte

index.php
<?php
 //on genere une constante qui contiendra le chemin vers index.php (la racine)
 define('ROOT', str_replace('index.php', '', $_SERVER['SCRIPT_FILENAME']));

 require_once(ROOT.'app/Model.php');
 require_once(ROOT.'app/Controller.php');
 $params = explode("/", $_GET['p']);

 if($params[0] != "")
 {
     $classe = ucfirst($params[0]);

     $method = isset($params[1]) ? $params[1]:"index";

     require_once(ROOT.'controllers/'.$classe.'.php');

     $control = new $classe();
     if(method_exists($classe, $method))
     {
         unset($params[0]);
         unset($params[1]);

         call_user_func_array([$classe, $method], $params);

         //$control->$method();

     }

     else
     {
         require_once(ROOT.'views/404.html');
     }

 }

?> 

Tout marché très bien jusqu'au point de passer un 3ème paramettre qui est l'id d'un article, pourtant chez lui, ça marche très bien mais chez moi, je suis bloqué malgrè le fait que j'ai le même code que lui. l'erreur provient vers la ligne ou il utilise la fonction call_user_func_array() et le message d'erreur qui m'est renvoyé c'est:

Deprecated: Non-static method Articles::index() should not be called statically in C:\wamp64\www\MVC\index.php on line 25

et l'autre c'est


Fatal error: Uncaught Error: Using $this when not in object context in C:\wamp64\www\MVC\controllers\Articles.php on line 13

Error: Using $this when not in object context in C:\wamp64\www\MVC\controllers\Articles.php on line 13

la partie qui pose problème

index.php
<?php

         unset($params[0]);
         unset($params[1]);

         call_user_func_array([$classe, $method], $params);

         //$control->$method();

?> 

à noter que le fichier Articles.php se comporte comme indiquer ci-dessous:

Articles.php
<?php

  class Articles extends Controller {

     public function index()
     {
         //$articles = $this->envoie('Article')->getAll();
         $arts = new Controller();
         $lines = $arts->envoie('Article');
         $articles = $lines->getAll();

         $this->viewsArticle('index', ['articles'=>$articles]);

     }
     public function lire($id)
     {
         echo $id;
     }
  }
?>

S'il vous plaît, besoin d'aide, le besoin c'est d'arriver à passer le 3è paramettre

6 réponses


Bonjour, il y a une erreur avec lire puisque vous appelez en statique, essayez ca :
class Articles extends Controller {
// ...

public static function lire($id)
{
    echo $id;
}

}

puis modifiez cette partie :
call_user_func_array([$control, $method], $params);

Merci pour votre réaction mais le problème est toujour là malgrè cette correction. alors comment dois-je modifié la partie call_user_func_array

Je vois, merci de clarifier. Si vous avez modifié la méthode pour être statique, alors vous devez également ajuster la manière dont vous l'appelez dans votre fichier index.php. Voici comment vous pouvez le faire :

call_user_func_array([$classe, $method], $params);

Dans votre cas, $classe contient le nom de la classe (Articles), mais vous devez utiliser une instance de cette classe pour appeler une méthode non statique. Dans votre code, vous avez déjà créé une instance de la classe avec la ligne suivante :

$control = new $classe();

Ainsi, vous pouvez maintenant utiliser $control pour appeler la méthode :

call_user_func_array([$control, $method], $params);

Cela devrait résoudre le problème que vous avez rencontré. Assurez-vous de toujours créer une instance de la classe avant d'appeler des méthodes non statiques sur cette classe.

Merci beaucoup Ir, merci infiniment, ça marche comme je le voulais vraiment

au plaisir :)

Merci pour votre aide. J'en avais besoin de ces informations.