3 votes

PHP - méthode statique dans une classe ou simplement une fonction

J'ai un dilemme concernant l'utilisation du contrôleur. Comme d'habitude, le routeur (répartiteur ou contrôleur frontal) appelle une méthode statique dans la classe du contrôleur, par exemple PageController: : showIndexPage() . Mes contrôleurs ont habituellement plusieurs lignes de code et c'est habituellement le chargement du modèle, la récupération des données et le passage à la vue.

Ma question est la suivante : étant donné qu'une seule méthode est exécutée par requête http, dois-je éviter les classes et créer une seule fonction pour le contrôleur ? Parfois, j'ai vraiment plusieurs méthodes par contrôleur, mais à chaque fois, une seule méthode est utilisée. Je sais que ce n'est pas un gros problème, mais peut-être que je peux obtenir un meilleur système ? Voici un exemple : Mon AuthController a des méthodes comme showLoginPage(), doLogin(), doLogout()... Donc, peut-être que c'est une meilleure idée d'éviter la classe, et d'écrire ce contrôleur comme plusieurs fonctions dans des fichiers séparés, eq auth/show_login_page.php, auth/do_login.php, et ainsi de suite ? Ce concept a-t-il des avantages et des inconvénients ?

Mise à jour : Parce que certains utilisateurs bloquent mon utilisation de la méthode statique, je dois me défendre :) Je ne crée pas d'instance de contrôleur, car il n'y a pas besoin de cela. Dans 99% des cas, le contrôleur est seulement utilisé pour passer les données du modèle à la vue. Et, il n'y a pas besoin de créer une instance pour un seul appel de méthode, c'est la raison pour laquelle la méthode est statique. Voici un exemple d'un de mes contrôleurs :

class ArticlesController {

    static function showArticle($article_id) {
        $article = ArticlesModel::getArticleById($article_id);
        View::getInstance()->assignByRef("article", $article);
        View::getInstance()->display("articles/one.tpl");
    }
    static function showAllArticles() {
        $articles = ArticlesModel::getAllArticles();
        View::getInstance()->assignByRef("articles", $articles);
        View::getInstance()->display("articles/all.tpl");
    }
}

2voto

hakre Points 102271

Les fonctions de classe statiques sont à peu près comme des fonctions globales, donc aucune idée de la raison spécifique pour laquelle vous utilisez des fonctions de classe statiques pour vos contrôleurs (ce qui est plutôt gênant), donc soit vous les changez en méthodes d'objet standard ou en fonctions globales.

Je vous suggère de diviser toute votre application en une branche qui remplace tous les contrôleurs par des fonctions globales et l'autre branche par des fonctions de classe non statiques. Vous pourrez alors mieux comparer les deux concepts.

Si vous ne voulez pas jouer et que vous demandez des pointeurs, convertissez toutes les fonctions de classe statiques en fonctions non statiques, puis continuez jusqu'à ce que vous rencontriez le problème suivant.

2voto

Wahab Qureshi Points 31

Je ne comprends pas bien la première réponse qui a été votée et marquée comme étant la bonne. Voici ce que j'en pense :

Les méthodes statiques sont comme les méthodes globales mais plus organisées et contenues dans un espace de nom et une classe. Cela ne signifie pas qu'elles sont meilleures que les objets du seul fait de cette définition. Elles ont leur utilité. Si vous travaillez avec une classe qui va maintenir un état particulier, il est plus approprié d'utiliser une classe non statique, c'est-à-dire que vous devez l'instancier et l'utiliser. Si elle ne va pas maintenir un état particulier dans ledit processus, c'est-à-dire qu'elle reçoit simplement des paramètres, en fait quelque chose et renvoie la réponse, elle est plus adaptée pour être statique.

C'est ma vision simpliste de l'opposition entre statique et non statique. Dans votre cas, vous pouvez avoir besoin que d'autres choses se produisent pour le bon fonctionnement de vos contrôleurs. Une de ces choses qui est généralement problématique est le fait que les classes statiques n'ont pas de constructeur car elles ne s'instancient pas. C'est la seule bonne raison pour laquelle je pense que votre contrôleur peut être instancié si le parent a un constructeur et reçoit des objets qui sont définis pour être utilisés à travers vos contrôleurs. Je pense que vous avez raison avec les contrôleurs statiques s'ils sont aussi simples.

Pour ce qui est de la question de savoir s'il s'agit d'une simple fonction ou d'un cours. Une classe encapsule votre logique en une seule unité. C'est simplement un moyen de statique que tout ce qui est dans ce groupe appartient strictement à cette unité. Nous venons d'un monde où nous avions l'habitude d'avoir de simples fonctions, mais cela se déforme généralement assez rapidement. Jetez un coup d'œil à l'entropie des logiciels, il n'y a pas grand-chose qui puisse empêcher que cela se produise. Puisque les classes sont une référence à ce qu'elles contiennent, les gens les utilisent de cette manière. Vous pouvez imaginer avoir 10 exigences au sommet d'un fichier, puis vous avez soudainement besoin d'une fonction, un développeur peut ne pas y penser beaucoup et juste l'ajouter à l'un des fichiers les plus proches et dire ah c'est tout inclus de toute façon donc ça va fonctionner. Alors qu'avec les classes, vous êtes en quelque sorte forcé de réfléchir à l'endroit où la placer, si vous la placez au mauvais endroit, les développeurs la manqueront probablement car elle n'est pas globalement disponible.

J'espère que cela vous aidera.

0voto

Shi Points 2792

Je dirais, gardez ensemble ce qui va ensemble. Donc, utilisez une classe. De plus, l'utilisation d'une classe donne automatiquement une sorte d'espace de nom. Tout simplement parce que si vous avez une méthode appelée doSomething() dans plusieurs fichiers d'inclusion, vous ne pouvez pas inclure plus d'un de ces fichiers. Cependant, si la méthode est placée dans une "classe statique", tous les fichiers peuvent être inclus. Depuis PHP 5.3, vous pouvez également utiliser de "vrais" espaces de noms, mais l'approche par classe est toujours préférable.

Ou imaginez que vous ayez besoin d'une constante. S'il s'agit d'une classe, la constante se trouve dans la portée de la classe. Si vous utilisez des fonctions, vous devez polluer l'espace de noms global et une seule constante avec un tel nom peut être présente à la fois.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X