0
votes

Quel est le raisonnement pour ne pas utiliser de classe dans une fonction php

Je visitant cette question PHP - Définition de classes à l'intérieur d'une fonction ( Comment il a tellement de upvotes est au-delà de moi)

En bref, il ne répond pas à ma question. P>

Spécifiquement parler de la création de plug-in WordPress Création Codex P>

Un brefcode est quelque chose que vous pouvez Utilisez dans n'importe quel plugin une fois créé par exemple P> xxx pré>

maintenant n'importe où que je voulais afficher le numéro 5 code> Je peux simplement faire p>

//Create callback for shortcode
 function CreateFooClass(){
  class Foo{
    function Bar(){
      return "FooBar";
    }
  }
 }

 //Create shortcode as [include_Foo]
 add_shortcode('include_foo','CreateFooClass');

 //Use case
 do_shortcode("[include_foo]");

 $foo = new Foo();

 echo $foo->Bar();

 //Ouput
 "FooBar"


10 commentaires

Après avoir lu la question que vous avez liée, il semble que le jury soit toujours sur le point de savoir s'il est effectivement une mauvaise pratique imho, d'où les upvotes.


Le plus gros problème est que si vous appelez createefooclass () deux fois, vous obtenez une erreur fatale. Je recommande de mettre la classe dans un fichier dédié et d'avoir la fonction Createefooclass () simplement requier_once () ce fichier de classe. Cela permet à votre fichier de classe d'être importable sans nécessiter la présence de CreateEfooclass ()


Après 8 ans, je supposerais peut-être que quelqu'un aurait une réponse @Russj ou au moins un nouveau code magique est utilisé en place


@MONKEYZEUS, mais cela signifierait que vous devez avoir plusieurs fichiers, car vous ne pouvez pas nécessiter un fichier en dehors de votre dossier.


@Josephwilliamson Coke et Pepsi ont été autour de plus de 100 ans et que les gens entrent toujours dans des fisthights sur ce qui est meilleur :-p


Où avez-vous eu l'idée que vous ne pouvez pas avoir besoin d'un fichier en dehors d'un dossier? Je voudrais également remettre en question la manière dont cette façon de définir une classe est utile, lorsqu'il y a de l'autoloading ou tout simplement une ancienne inclusion requise_once.


Malheureusement, je ne connais pas du tout avec la structure de WordPress. Cependant, je suppose que votre dilemme est que votre plug-in ne connaît pas les classes installées de l'utilisateur? Si tel est le cas, expédiez votre classe dans un sous-dossier de votre plug-in. Si mon commentaire est pur non-sens, veuillez élaborer ce que vous voulez dire par Vous ne pouvez pas nécessiter un fichier qui est en dehors de votre dossier ?


Il semble que vous voulez juste une méthode d'assistance pour faire votre journalisation. Comme pour la réponse affichée, je n'irais pas non plus à la route de la courte durée - il peut fonctionner techniquement, mais certainement pas la méthode envisagée lorsque vous pouvez simplement charger la classe sans tout le travail supplémentaire. Vous pouvez envisager de créer un plugin qui crée la classe de la classe que vous pouvez accéder partout si vous êtes préoccupé par la duplication du contenu dans chacun de vos plugins.


@Disinfor c'est exactement ce que j'essaie d'accomplir, mais je rencontre également ce dilema pour ceux qui ne sont pas familiarisés avec WordPress à l'aide d'un autocharger ne rend que la classe disponible dans le répertoire du plug-in, il ne serait pas disponible à un niveau supérieur ou à un autre plugin. répertoires


La classe n'est pas uniquement disponible dans le répertoire du plug-in. Il est disponible partout dès que cela instancite. Vous devez vous assurer qu'il charge avant les autres plugins.


3 Réponses :


1
votes

Les courts-courts WordPress n'ont jamais été conçus pour être appelés dans le contexte PHP. Ils sont destinés à être utilisés dans le contenu . Être capable d'appeler ShortCode dans PHP est plus en détail de la mise en œuvre que quelque chose que vous feriez normalement.

Donc, oui, techniquement, vous pouvez utiliser cela pour appeler ShortCode de PHP pour l'utiliser comme une sorte de mécanisme de charge de classe.

ou vous pouvez un réel de classe autoload et $ foo = nouveau foo (); fonctionnerait sans code supplémentaire.

Donc, personne ne le fait (ou quoi que ce soit comme ça), car l'autoload est une chose et fonctionne bien.


0 commentaires

-1
votes

déclarer une classe à l'intérieur d'une fonction est probablement une erreur.

Si une déclaration de classe apparaît dans une fonction, la classe est définie lorsque cette fonction est appelée. La classe ne sera pas disponible avant l'appelée de la fonction et appelle la fonction deux fois entraînera une erreur fatale ("ne peut pas déclarer la classe ..., car le nom est déjà utilisé").

En tant que code short de WordPress, vous pouvez appeler plusieurs fois lors d'une exécution d'une script, déclarant une classe à l'intérieur du gestionnaire d'un code abrégé est susceptible de provoquer des erreurs. Si vous voulez déclarer une classe, faites-le au niveau supérieur d'un fichier.


0 commentaires

1
votes

Je comprends que Programmation orientée objet a été sur le dessus pour une douzaine de Années, mais WP utilise un paradigme complètement différent: Programmation structurelle . Alors essayez d'éviter de mélanger cela.

et maintenant pour votre cas:

Si vous utilisez autoloader , puis les fichiers avec des classes seront automatiquement incluses sur une utilisation de la première classe.

De plus, vous utilisez des définitions de classe droite à partir de PHP4. Dans php5, les mots-clés public , privé , protégé a été introduit (pour ajuster la visibilité des méthodes dans les classes).

Il semble que do_shortcode est créé Pour retourner HTML, la solution suivante ne peut pas être utilisée avec elle. (Mais essayez-le, je ne suis pas sûr.) xxx


5 commentaires

On dirait que cela résoudra ce que j'ai vu d'autres personnes se plaignent d'une erreur fatale si la fonction est appelée plus une fois


C'est pourquoi il y a ajouté si (! Classe_existes ('foo'))


Votre fonction doit être nommée déclrefooclass car pour la création nécessite nouvel opérateur .


bon point @ bato3 cela ne décrit pas pourquoi je ne devrais pas mélanger le 2 juste que je ne devrais pas devoir


Simplement: certaines choses ne conviennent pas à faire. Ici vous introduisez la confusion. Pour l'interprète PHP, la forme du code n'a pas d'importance, mais dans d'autres personnes, ce code sera ennuyeux.