Comment définir et utiliser des variables globales? Ou pourquoi ne pas les utiliser du tout
-
-
Quel lien cette déclarationfait-elle échoesc_url ($ category_link_prop);affiche?Quelest votre lien attendu?Which link does this statement echo esc_url( $category_link_prop ); displays ? What is your expected link?
- 1
- 2013-03-04
- Vinod Dalvi
-
Pourquoin'utiliseriez-vouspas simplement 'get_cat_ID (****)' là où vous avezprévu d'utiliser la variableglobale.Je doute qu'il y ait un avantage de vitesse dans lafaçon dont vous lefaites.Dupoint de vue de la lisibilité,«get_cat_ID (****)» l'emporte haut lamain.Why would you not just use 'get_cat_ID( **** )' where ever you planned to use the global variable. I doubt there would be any speed advantage the way your doing it. From a readability standpoint, 'get_cat_ID( **** )' wins hands down.
- 1
- 2013-03-04
- Chris Strutton
-
Pouvez-vous reformuler?J'ai lu votre questionet jene saistoujourspas ce que vous voulezfaireet pourquoi vous voulez lefaire.Mon conseilgénéral serait dene pas utiliser de variablesglobales,et dene paspolluer laportéeglobaleCan you reword? I read your question and I'm still unsure of what you want to do and why you want to do it. My general advice would be to not use global variables, and not to pollute the global scope
- 1
- 2013-03-04
- Tom J Nowell
-
@VinodDalvi J'espérais obtenir le lien vers la catégorie avec laproposition de slug '.@VinodDalvi I was hoping to get the link to the category with the slug proposal'.
- 0
- 2013-03-05
- JPollock
-
@TomJNowell Je vais éditer dans uneminutepour refléter quej'utilise cecipour lesnavigations,de sorte qu'ils seront utilisés sur àpeuprèsn'importe quellepage detoutefaçon.@TomJNowell I will edit in a minute to reflect that I'm using this for navigations, such they will be used on pretty much any page anyway.
- 0
- 2013-03-05
- JPollock
-
@ChrisStruttonget_cat_id ()ne me donnepastout ce dontj'aibesoin (ie le lien,letitre,etc.).La lisibilitén'estpas unepréoccupationmajeurepourmoi,je serai le seul à lire souvent ceci.@ChrisStrutton get_cat_id() doesn't five me everything I need (ie the link, the title, etc.). Readability isn't a huge concern for me, I will be the only oen reading this.
- 0
- 2013-03-05
- JPollock
-
cela ressemble unpeu à un [problème X/Y] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem).peut-être devriez-vous reveniren arrièreet expliquerexactement quelest le résultat souhaité.Je suis certain qu'ilexiste une solutionbeaucoupplus élégante que de définir untas de variablesglobalespourensuite simplement coderen dur leurs références dans unenavigation ailleursthis is sounding a bit like an [X/Y Problem](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). perhaps you should back up and explain exactly what your desired outcome is. I'm certain there's a far more elegant solution than setting a bunch of global vars to then just hardcode references to them in a nav elsewhere
- 1
- 2013-03-05
- Milo
-
@Milo Excellentpoint.Monproblème réelest quemonthème a 4navigations différentes (jusqu'àprésent.) 1 quiest unebarre supérieure standardet 3 quine s'affichent que dans certaines conditions.Ilsmontrenttous des combinaisons différentes àpeuprès desmêmes choseset sont dans des ordres arbitraireset vont changer àmesure que leprojet avance.Monproblèmeest que sije les codeen dur,je devrai coderen dur lamême choseencoreet encore,puis changer lamême chose 4fois à chaquefois que quelque chose change.@Milo Excellent point. My actual problem is my theme has 4 different navigations (so far.) 1 that is a standard top bar, and 3 that only display based on certain conditions. They all show different combinations of roughly the same things and are in arbitrary orders and are going to change as the project goes on. My problem is if I hard-code them, I will have to hardcode the same thing over and over again, and then change the same thing 4 times every time something changes.
- 0
- 2013-03-05
- JPollock
-
créez unefonction quigénère votremenuen fonction du contexte que vous luipassez,de cettefaçon vouspouvez conservertoute la logique dumenuet les variables associéesencapsuléesen un seulendroit.create a function that outputs your menu based on the context you pass to it, that way you can keep all of the menu logic and associated vars encapsulated in one place.
- 2
- 2013-03-05
- Milo
-
@Milo C'est ce avec quoij'ai commencé,maisje sais quej'ai unefonctionpour lanavigation dans labarre supérieure;unefonctionpour unebarre denavigation latérale qui vient depasser à 4 versions différentesbasées sur des conditions;et unefonctionpour un sous-nav dans unmodèle depageet il yen auraplus aufuret àmesure.Jene peuxpastrouver unemanière sensée de combinertous ces élémentsen une seulefonction.@Milo That's what I started with, but know I have one function for top bar navigation; one function for a side bar nav which just grew to 4 different versions based on conditionals; and one function for a sub-nav in a page template and there are going to be more of those as this goes on. I can't come up with a sane way of combining all of those into one function.
- 0
- 2013-03-05
- JPollock
-
@Milo Je souhaite égalementpouvoir les utiliser comme liens vers diversesparties du site dans letexte du site,soit dans des articles (si celafonctionne),soit dans desmodèles depage.@Milo Also I want to be able to use these as links to various parts of the site in the text of the site, either in posts (if that works) or in page templates.
- 0
- 2013-03-05
- JPollock
-
4 réponses
- votes
-
- 2013-03-04
Bien queje déconseillefortement cela,et que cela n'accélérerapas les choses,votre utilisationestincorrecte.
WordPressmet déjà ces élémentsen cache dans le cache d'objets,vousn'avezpasbesoin de stocker le résultatet de le réutiliser,WP lefait déjà .
Ilesttrèsprobable que votre code s'exécuteplus lentementen raison de cettemicro-optimisation,pasplus vite!
Comment utiliser Globals
Lorsque vousessayez d'utiliser unglobal,vous devez d'abord spécifier lemot-clé
global
. Vous l'avez spécifiéici lors de la définition de sa valeur,maisen dehors de cetteportée,il doit être redéclaréen tant que variable deportéeglobale.parexemple dans
functions.php
:function test() { global $hello; $hello = 'hello world'; } add_action( 'after_setup_theme', 'test' );
Dans
single.php
,celane fonctionnerapas:echo $hello;
Parce que
$hello
n'estpas défini. Cependant,cela fonctionnera :global $hello; echo $hello;
Bien sûr,vousne devriezfaireni l'unni l'autre. WordPresstente déjà demettre ces élémentsen cache dans le cache d'objets .
Inconvénientset dangers des variablesglobales
Vousne verrez aucune augmentation de vitesseen faisant cela (vouspouvez voir unepetite diminution de vitesse),tout ce que vous obtiendrez,c'est une complexité supplémentaireet lanécessité detaperbeaucoup de déclarationsglobales quine sontpasnécessaires.
Vous rencontrerez également d'autresproblèmes:
- codepour lequelilestimpossible d'écrire destests
- code qui se comporte différemment à chaqueexécution
- conflits dans lesnoms de variables àpartir d'unespace denompartagé
- bogues accidentels dus à l'oubli de déclarer
global
- unmanquetotal de structure dans le stockage des données de vos codes
- et bien d'autres
Que devriez-vous utiliser à laplace?
Vousferiezmieux d'utiliser des données structurées,telles que des objets ou l'injection de dépendances,ou dans votre cas,unensemble defonctions.
Variables statiques
Les variables statiquesne sontpasbonnes,mais considérez-les comme le cousin légèrementmoinsmauvais des variablesglobales. Les variables statiques sont aux variablesglobales,ce que lepain couvert deboueest au cyanure.
Parexemple,voici unmoyen defaire quelque chose de similaire via des variables statiques,parexemple
function awful_function( $new_hello='' ) { static $hello; if ( !empty( $new_hello ) ) { $hello = $new_hello; } return $hello; } awful_function( 'telephone' ); echo awful_function(); // prints telephone awful_function( 'banana'); echo awful_function(); // prints banana
Singletons
Les singletons sont comme des variables statiques,sauf que la classe contient une variable statique avec uneinstance de cette classe. Elles sonttout aussimauvaises que les variablesglobales,mais avec une syntaxe différente. Évitez-les.
WP_Cache,ce que vous avezessayé defairemais que WP lefait déjà
Si vous voulez vraimentgagner dutempsen stockant les données quelquepartpour les réutiliser,pensez à utiliser le système
WP_Cache
avecwp_cache_get
etc.parexemple$value = wp_cache_get( 'hello' ); if ( false === $value ) { // not found, set the default value wp_cache_set( 'hello', 'world' ); }
Maintenant,la valeur seramiseen cachepour la durée de vie de la requêtepar WordPress,apparaîtra dans les outils de débogage,et si vous avez un cache d'objets,ellepersistera àtravers les requêtes
Note 1: Je voudraisnoter que certainespersonnesessaient de conserver les données dans des variablesglobales àtravers les requêtes,sans savoir que cen'estpas ainsi que PHPfonctionne. Contrairement à une application Node,chaque requête charge unenouvelle copie de l'application,quimeurtensuite lorsque la requêteestterminée. Pour cette raison,les variablesglobales définies sur une requêtene surviventpas à la requête suivante
Note 2: àen jugerpar la questionmise àjour,vos variablesglobalesne vous donnent aucungain deperformance. Vous devriez simplementgénérer le HTML aufuret àmesure que vousen avezbesoinet ilfonctionneraittout aussi vite,peut-êtremême unpeuplus vite. C'est de lamicro-optimisation.
While I strongly advise against this, and it will not speed things up, your usage is incorrect.
WordPress already caches these things in the object cache, you don't need to store the result and reuse, WP does that already.
It's very likely your code is running slower as a result of this micro-optimisation, not faster!
How To Use Globals
When you try to use a global you must specify the
global
keyword first. You have specified it here when defining its value, but outside of that scope it needs to be redeclared as a global scope variable.e.g. in
functions.php
:function test() { global $hello; $hello = 'hello world'; } add_action( 'after_setup_theme', 'test' );
In
single.php
, this will not work:echo $hello;
Because
$hello
is undefined. This however will work:global $hello; echo $hello;
Of course you should do neither. WordPress already attempts to cache these things in the object cache.
Disadvantages and Dangers of Global Variables
You will see no speed increase from doing this ( you may see a tiny speed decrease ), all you will get is additional complexity and the need to type out a lot of global declarations that aren't necessary.
You'll also encounter other issues:
- code that's impossible to write tests for
- code that behaves differently every time it runs
- clashes in variable names from a shared name space
- accidental bugs from forgetting to declare
global
- a complete lack of structure to your codes data storage
- and many more
What Should You Use Instead?
You would be better off using structured data, such as objects or dependency injection, or in your case, a set of function.
Static Variables
Static variables aren't good, but think of them as the slightly less evil cousin of global variables. Static variables are to global variables, what mud covered bread is to cyanide.
For example, here is a means of doing something similar via static variables e.g.
function awful_function( $new_hello='' ) { static $hello; if ( !empty( $new_hello ) ) { $hello = $new_hello; } return $hello; } awful_function( 'telephone' ); echo awful_function(); // prints telephone awful_function( 'banana'); echo awful_function(); // prints banana
Singletons
Singletons are like static variables, except the class contains a static variable with an instance of that class. They're just as bad as global variables, just with different syntax. Avoid them.
WP_Cache, The Thing You Tried to Do But WP Already Does It
If you really want to save time by storing data somewhere to re-use, consider using the
WP_Cache
system withwp_cache_get
etc e.g.$value = wp_cache_get( 'hello' ); if ( false === $value ) { // not found, set the default value wp_cache_set( 'hello', 'world' ); }
Now the value will get cached for the life of the request by WordPress, show up in debugging tools, and if you have an object cache it'll persist across requests
Sidenote 1: I would note, that some people try to persist data in global variables across requests, unaware that this is not how PHP works. Unlike a Node application, each request loads a fresh copy of the application, which then dies when the request is completed. For this reason global variables set on one request do not survive to the next request
Sidenote 2: Judging from the updated question, your global variables give you no performance gain at all. You should just generate the HTML as and when you need it and it would run just as fast, perhaps even a tiny bit faster. This is micro-optimisation.
-
Je sais que c'est unpeufou d'utiliser laportéeglobale,mais laplupart,sinontoutes ces variables seront utilisées sur chaquepage.Je suis ouvert à demeilleuresidées.Je vaismodifier la questionpour rendremonintention unpeuplus claire.BTW celafonctionneparfaitementbien quandje fais ` Phpglobal $ category_link_prop;echoesc_url ($ category_link_prop);?> `selon votre suggestion.Merci!I know it's a little nuts to use the global scope, but most, if not all of these variables will be used on every page. I'm open to better ideas. I am going to edit the question to make my intent a little clearer. BTW it works perfectly fine when I do `` as per your suggestion. Thanks!
- 0
- 2013-03-05
- JPollock
-
Ah sima solutionfonctionne,pourriez-vousmarquer comme acceptée?Vos variablesglobales sonttout aussi rapides que l'appel d'origine,vous voudrezpeut-êtreessayer d'utiliser desfonctions à laplacepourne pas avoirbesoin detaper 2 lignes,mieuxencore,un singleton,mieuxencore,rendretout cela dynamiqueet dans unpartie demodèleincluse viaget_template_partAh if my solution works, could you mark as accepted? Your global variables are just as fast as making the original call, you may want to try instead using functions so you don't need to type out 2 lines, better yet, a singleton, better yet, make all of that dynamic and in a template part included via get_template_part
- 2
- 2013-03-05
- Tom J Nowell
-
Marqué comme accepté comme ce queje faismaintenant,bien queje puisse utiliser l'une des stratégies suggéréespar @MarkKaplun ci-dessous.Utiliserget_template_part ()est uneidéeintéressante,maisje ne suispas sûr de vouloir avoir un répertoireplein defichiers courts comme ça ...Marked as accepted as its what I am doing now though I may go with one of the strategies @MarkKaplun is suggesting below. Using get_template_part() is an interesting idea, but I'm not sure I want to have a dir full of short files like that...
- 0
- 2013-03-06
- JPollock
-
ooohnonnon vousne voudriezpas unfichierpour chaque catégorie,vous voudriezjuste celui qui saisit lenom de la catégorie actuelleet l'utilise.Vousne devriezpas avoir à coder quoi que ce soiten dur,imaginez lestracas detout coderen duroooh no no you wouldn't want a file for each category, you'd want just the one that grabs the current category name and uses that. You shouldn't have to hardcode anything, imagine the hassle of hardcoding it all
- 0
- 2013-03-06
- Tom J Nowell
-
J'aimis le code dansmon child-functions.php quiest actif.Maisje nepeuxpas accéder à la variable dans unfichierphp-include quej'appelle àpartir d'unmessagegénérépar unebase de données "normal".Veuillezme conseiller,que dois-jefaire demal?(Je le définis commeglobal,bien sûr.)I put the code in my child-functions.php which is active. But I can not access the variable in a php-include file I call from a "normal" database-generated post. Please advise me, what do I do wrong? (I define it as global, of course.)
- 0
- 2018-06-03
- ycc_swe
-
Vous devez déclarer «global» chaquefois que vous l'utilisez.Cen'estpas une utilisation unefois que celafonctionnepartout,vous devez l'utiliser à chaquefois,et à chaquefois,sans aucuneexception.Mais commeje le dis dansma question,les variablesglobales sont demauvaisespratiques,problématiqueset non la solution que vous recherchez à votreproblème.Même lemal qu'est les singletons serait unemeilleure solutionYou have to declare `global` every time you use it. It isn't a use once works everywhere affair, you have to use it each, and every, single time, no exceptions of any kind. But as I say in my question, global variables are bad practice, problematic, and not the solution you're looking for to your problem. Even the evil that is singletons would be a better solution
- 0
- 2018-06-03
- Tom J Nowell
-
Merci,j'apprécie votre commentaire.Je l'ai déclaréet utilisé,mais quelquepart,j'ai dûfaire uneerreur.Celan'atout simplementpasfonctionnépourmoi.J'aiessayé différentes approches.Enfin [celui-ci] (https://gist.github.com/aahan/7444046) afonctionné.Je suis d'accord avec ce que vous dites sur lesglobaux,maisparfois une solution rapideestnécessairepour un sitepersonnel.Merci.Thank you, I appreciate your comment. I declared it and used it but somewhere I must have made a mistake. It just didn't work for me. I tried different approaches. Finally [this one](https://gist.github.com/aahan/7444046) worked. I agree with what you say on globals, but sometimes a quick fix is needed for a personal site. Thanks.
- 0
- 2018-06-03
- ycc_swe
-
- 2013-03-04
N'utilisezpas de variablesglobales ,aussi simple que cela.
Pourquoine pas utiliser lesglobaux
Parce que l'utilisation deglobals rendplus difficile lamaintenance du logiciel sur le longterme.
- Unglobalpeut être déclarén'importe où dans le code,ounullepart dutout,iln'y a donc aucunendroit où vouspouvezinstinctivement regarderpourtrouver des commentaires sur l'utilisation duglobal
- Lors de la lecture du code,vous supposezgénéralement que les variables sont locales à lafonctionet ne comprenezpas que lamodification de leur valeur dans unefonctionpeut avoir un changement à l'échelle du système.
- Siellesne gèrentpas lesentrées,lesfonctions doivent renvoyer lamême valeur/sortie lorsqu'elles sont appelées avec lesmêmesparamètres. L'utilisation deglobaux dans unefonctionintroduit desparamètres supplémentaires quine sontpas documentés dans la déclaration defonction.
- lesglobauxn'ontpas de construction d'initialisation spécifiqueet vousne pouvez doncjamais être sûr quand vouspouvez accéder à la valeur duglobal,et vousn'obtenez aucuneerreuren essayant d'accéder auglobal avant l'initialisation.
- Quelqu'un d'autre (unpluginpeut-être)pourrait utiliser desglobaux avec lemêmenom,ruiner votre code ou vous ruineren fonction de l'ordre d'initialisation.
Lenoyau de WordPress abeaucoup à utiliser lesglobaux. Enessayant de comprendre commentfonctionnent lesfonctions debase comme
the_content
,vous vous rendez compte soudainement que la variable$more
n'estpas localemaisglobaleet doit rechercher l'ensemble desfichiers debasepour comprendre quandest-il défini sur vrai.Alors,quepeut-onfaireen essayant d'arrêter le copier-coller deplusieurs lignes de code au lieu de stocker le résultat de lapremièreexécution dans unfichierglobal? Ilexisteplusieurs approches,fonctionnelleset POO.
Lafonction édulcorant. C'est simplement un wrapper/macropourenregistrer le copier/coller
// input: $id - the category id // returns: the foo2 value of the category function notaglobal($id) { $a = foo1($id); $b = foo2($a); return $b; }
Les avantages sont qu'ilexistemaintenant une documentation sur ce quefait l'ancienglobal,et vous avez unpoint évidentpour le débogage lorsque la valeur renvoyéen'estpas celle que vous attendez.
Unefois que vous avez un édulcorant,ilestfacile demettreen cache le résultat sinécessaire (ne lefaites que si vous découvrez que cettefonctionprendbeaucoup detemps à s'exécuter)
function notaglobal($id) { static $cache; if (!isset($cache)) { $a = foo1($id); $b = foo2($a); $cache = $b; } return $cache; }
Cela vous donne lemême comportement d'unglobalmais avec l'avantage d'avoir uneinitialisation assurée à chaquefois que vous y accédez.
Vouspouvez avoir desmodèles similaires avec la POO. Jetrouve que la POOn'ajoutegénéralement aucune valeur auxpluginset auxthèmes,mais c'est une discussion différente
class notaglobal { var latestfoo2; __constructor($id) { $a = foo1($id); $this->latestfoo2 = foo2($a) } } $v = new notaglobal($cat_id); echo $v->latestfoo2;
C'est un codeplusmaladroit,mais si vous avezplusieurs valeurs que vous souhaitezprécalculer carelles sonttoujours utilisées,celapeut être une solution. Fondamentalement,c'est un objet qui contienttous vosglobals demanière organisée. Pour éviter defaire d'uneinstance de cet objet uneinstanceglobale (vous voulez uneinstance sinon vous recalculez les valeurs),vouspouvez utiliser un motif singleton (certainespersonnes soutiennent que c'est unemauvaiseidée,YMMV)
Jen'aimepas accéder directement à un attribut d'objet,donc dansmon codeil se déformeraencore
class notaglobal { var latestfoo2; __constructor() {} foo2($id) { if (!isset($this->latestfoo2)) { $a = foo1($id); $b = foo2($a); $this->latestfoo2= $b; } return $this->latestfoo2; } } $v = new notaglobal(); echo $v->foo2($cat_id);
Don't use global variables, as simple as that.
Why not to use globals
Because the use of globals makes it harder to maintain the software in the long term.
- A global can be declared anywhere in the code, or nowhere at all, therefor there is no place in which you can instinctivly look at to find some comment about what the global is used for
- While reading code you usually assume that variables are local to the function and don't understand that changing their value in a function might have a system wide change.
- If they don't handle input, functions should return the same value/output when they are called with the same parameters. The use of globals in a function introduce additional parameters which are not document in the function declaration.
- globals don't have any specific initialization construct and therefor you can never be sure when you can access the value of the global, and you don't get any error when trying to access the global before initialization.
- Someone else (a plugin maybe) might use globals with the same name, ruining your code, or you ruining its depending on initialization order.
WordPress core has way way way much to much use of globals. While trying to understand how basic functions like
the_content
work, you suddenly realize that the$more
variable is not local but global and need to search whole of the core files to understand when is it set to true.So what can be done when trying to stop copy&pasting several lines of code instead of storing the first run result in a global? There are several approaches, functional and OOP.
The sweetener function. It is simply a wrapper/macro for saving the copy/paste
// input: $id - the category id // returns: the foo2 value of the category function notaglobal($id) { $a = foo1($id); $b = foo2($a); return $b; }
The benefits are that now there is a documentation to what the former global does, and you have an obvious point for debugging when the value being returned is not the one you expect.
Once you have a sweetener it is easy to cache the result if needed (do it only if you discover that this function takes a long time to execute)
function notaglobal($id) { static $cache; if (!isset($cache)) { $a = foo1($id); $b = foo2($a); $cache = $b; } return $cache; }
This gives you the same behavior of a global but with the advantage of having an assured initialization every time you access it.
You can have similar patterns with OOP. I find that OOP usually doesn't add any value in plugins and themes, but this is a different discussion
class notaglobal { var latestfoo2; __constructor($id) { $a = foo1($id); $this->latestfoo2 = foo2($a) } } $v = new notaglobal($cat_id); echo $v->latestfoo2;
This is a clumsier code, but if you have several values that you would like to precompute because they are always being used, this can be a way to go. Basically this is an object that contain all of your globals in an organized way. To avoid making an instance of this object a global (you want ont one instance otherwise you recompute the values) you might want to use a singleton pattern (some people argue it is a bad idea, YMMV)
I don't like to access an object attribute directly, so in my code it will warpe some more
class notaglobal { var latestfoo2; __constructor() {} foo2($id) { if (!isset($this->latestfoo2)) { $a = foo1($id); $b = foo2($a); $this->latestfoo2= $b; } return $this->latestfoo2; } } $v = new notaglobal(); echo $v->foo2($cat_id);
-
S'il vousplaît,**ne criezpas **.Voulez-vousexpliquerpourquoiet fournir une sorte de citation?Please, **don't shout**. Mind to explain why and provide some kind of citation?
- 7
- 2013-03-04
- brasofilo
-
Jepense que vous avezmal compris la réponse.S'iln'essayaitpas defaire une optimisationprécoceen stockant des valeurs dans des variablesglobales,son code auraitfonctionné.Le criestparce que suivre lesprincipes debase du développement logicielest quelque chose quine peutpas être assez souligné.Lespersonnes quine comprennentpas cesprincipes debase (disponibles sur votregoogle local)ne doiventpas diffuser de code sur lenet.I think that you misunderstood the answer. If he wasn't trying to do early optimization by storing values in global variables his code would have worked. The shouting is because following basic established software development principles is something that can't be emphasized enough. People who do not understand those basic principle (available at your local google) should not spread code over the net.
- 0
- 2013-03-04
- Mark Kaplun
-
Salut,Mark,excuses,mon commentaire était aussi court que votre réponseet je devrais êtreplus clair: 1) OMI,legras suffitpourfaire valoir unpoint.2) Bien queparfoisiln'y aitplus rien à dire,je soupçonne une ligne Réponses: [Est-il correct depublier une réponseen une ligne,ou serait-cemieuxen tant que commentaires?] (Http://meta.stackexchange.com/q/129019/185667)Hi, Mark, apologies, my Comment was as short as your Answer and I've should made myself clearer: 1) IMO, bold is enough to make a point. 2) Although sometimes there's nothing more to say, I suspect of one line Answers: [Is it okay to post a one-line answer, or would those be better as comments?](http://meta.stackexchange.com/q/129019/185667)
- 0
- 2013-03-04
- brasofilo
-
yeh,seulement après avoirposté,j'ai réalisé quej'aurais dû utilisergras.corrigera ceproblèmeyeh, only after I have posted I realized I should have used bold. will fix that asspect
- 0
- 2013-03-04
- Mark Kaplun
-
OMI,c'est une réponse,lesgens qui viennentici depuis Google devraient voir que c'est unemauvaiseidée demêmepenser à utiliser desglobauxtout de suite.IMO this is an answer, people who come here form google should see that it is a bad idea to even think about using globals right away.
- 1
- 2013-03-04
- Mark Kaplun
-
Ilne suffitpas de direne pasfaire X,vous devezexpliquerpourquoi ou vous avez l'air de le dire sur un coup detêteIt's not enough to say dont do X, you have to explain why or you look like you're saying it on a whim
- 6
- 2013-03-04
- Tom J Nowell
-
@MarkKaplun Queferiez-vous à laplacepour éviter d'avoir à écrireencoreet encore lemêmeensemble,puis de devoirmodifier chacun d'euxmanuellement si unepartie de celui-ci change?@MarkKaplun What would you do instead to avoid having to write the same set thing over and over again, and then have to change each one manually if any part of it changes?
- 0
- 2013-03-05
- JPollock
-
@JPollock,amodifié la réponse.@JPollock, edited the answer.
- 0
- 2013-03-05
- Mark Kaplun
-
@TomJNowell,je trouve drôle queje sois le seul à voter contre la questionelle-même,carelle sortaitmanifestement du cadre de WASE.Jen'aipas vu l'intérêt de développer un sujet quin'auraitpas dutout dû commencerici.@TomJNowell, I find it funny that I was the only one downvoting the question itself, as it was obviously outside of the scope of WASE. I didn't see the value of expanding on a subject which should not have been started here at all.
- 1
- 2013-03-05
- Mark Kaplun
-
@MarkKaplun Génial.Votrepremière solution semble être lameilleure.Je vaisexpérimenter lamiseen cache,ce qui seraprobablementnécessaire.Jene saispaspourquoi cela sort du cadre de cet échange depile?La question concerne PHP,maisil s'avère qu'elle atout à voir avec lafaçon dont WordPresstraite lesglobaux.Le casest également spécifique auxmenus denavigation WordPress.@MarkKaplun Awesome. Your first solution sounds like the best. I will experiment with caching, which will probably be necessary. I'm not sure why this is outside the scope of this stackexchange? The question is about PHP, but it turns out it has everything to do with how WordPress deals with globals. Also the case is specific to WordPress navigation menus.
- 0
- 2013-03-06
- JPollock
-
"Le cœur de WordPress abeaucoup à utiliser lesglobaux."Je dirais que Wordpress ayant * des *globaux dutoutestbeaucouptrop,mais cen'est quemoi."WordPress core has way way way much to much use of globals." I'd say Wordpress having *any* globals at all is way too many, but that's just me.
- 0
- 2014-04-02
- R Porter
-
@MarkKaplunmercipour votre approchefonctionnelle.Dans le cas oùnous leprenions,pourriez-vousfaire unemise àjourpournousmontrer à quoi cela devrait ressembler avec une valeur de repli de $ ID,sipour une raison quelconqueiln'existaitpas,n'étaitpas défini oun'étaitpas unentierpositif?@MarkKaplun thank you for your functional approach. In the event that we take it, could you make an update to show us how it should look like with a fallback value of $ID, if for some reason it didn't exist, was not set or was not a positive integer?
- 0
- 2016-10-21
- klewis
-
lesglobauxpeuvent souvent êtremauvaispour denombreuses raisons,mais lesgens qui disentne jamais utiliser lesglobaux le sont aussi.globals can often be bad for many reasons but so are people who say never use globals.
- 0
- 2018-02-18
- Joel M
-
- 2013-03-04
Votre question concerne lefonctionnement dephp.
Prenez $ wpdb commeexemple
$ wpdb est une variableglobalebien connue.
Savez-vous quandil sera déclaréet attribué avec des valeurs?
Chaquepage chargée ,oui,chaquefois que vous visitez votre site wordpress.
Demême,vous devez vous assurer que les variables que vous souhaitezglobaliser seront déclaréeset affectées avec les valeurs correspondantes à chaquepage chargée.
Bien queje ne soispas un concepteur dethèmes,je peux dire que after_setup_themeest un hookponctuel.ilne sera déclenché que lorsque lethème sera activé.
Sij'étais vous,j'utiliseraiinit ou d'autres hooks.Non,sij'étais vous,je n'utiliseraipas dutout de variablesglobales ...
Jene suis vraimentpas douépourexpliquer les choses.Donc,vous devriezprendre un livre si vous voulez vousplonger dans PHP.
Your question is involved with how php works.
Take $wpdb as example
$wpdb is a well-known global variable.
Do you know when it'll be declared and assigned with values ?
Every page loaded, yep, every time you visit your wordpress site.
Similarly, you need to make sure those variables that you want to be globalized will be declared and assigned with corresponding values every page loaded.
Although I'm not a theme designer, I can tell the after_setup_theme is one time hook. it'll only be triggered when theme activated.
If I were you, I'll use init or other hooks. No, if I were you, I won't use global variables at all...
I'm really not good at explaining things. So, you should pick up a book if you want to delve into PHP.
-
- 2015-11-25
Vouspouveztoujours utiliser unmotif singleton via desgetters statiques.
<ul> <li><?php echo MyGlobals::get_nav_prop( 'proposal' )[ 'html' ]; ?></li> <li><?php echo MyGlobals::get_nav_prop( 'calvinball', 'html' ); ?></li> </ul> <?php if ( ! class_exists('MyGlobals') ): class MyGlobals { public $props; public function __construct(){ $this->props = array ( 'proposal' => array( 'title' => 'Proposal', 'text' => 'Proposal' ), 'calvinball' => array( 'title' => 'Calvinball', 'text' => 'Calvinball' ), ); } public function get_nav_prop ( $term, $prop = false ) { $o = self::instance(); if ( ! isset( $o->props[$term] ) ) { return falst; } if ( ! isset( $o->props[$term][ 'html' ] ) ) { $id = get_cat_ID( $term ); $link = esc_url ( get_category_link( $id ) ); $title = $o->props[$term]['title']; $text = $o->props[$term]['text']; $o->props[$term]['html'] = '<a href="'.$link.'" title="'.$title.'">'.$text.'</a>'; $o->props[$term]['link'] = $link; $o->props[$term]['id'] = $id; } if($prop){ return isset($o->props[$term][$prop]) ? $o->props[$term][$prop] : null; } return $o->props[$term]; } // ------------------------------------- private static $_instance; public static function instance(){ if(!isset(self::$_instance)) { self::$_instance = new MyGlobals(); } return self::$_instance; } } endif; // end MyGlobals
You can always use a singleton pattern via static getters.
<ul> <li><?php echo MyGlobals::get_nav_prop( 'proposal' )[ 'html' ]; ?></li> <li><?php echo MyGlobals::get_nav_prop( 'calvinball', 'html' ); ?></li> </ul> <?php if ( ! class_exists('MyGlobals') ): class MyGlobals { public $props; public function __construct(){ $this->props = array ( 'proposal' => array( 'title' => 'Proposal', 'text' => 'Proposal' ), 'calvinball' => array( 'title' => 'Calvinball', 'text' => 'Calvinball' ), ); } public function get_nav_prop ( $term, $prop = false ) { $o = self::instance(); if ( ! isset( $o->props[$term] ) ) { return falst; } if ( ! isset( $o->props[$term][ 'html' ] ) ) { $id = get_cat_ID( $term ); $link = esc_url ( get_category_link( $id ) ); $title = $o->props[$term]['title']; $text = $o->props[$term]['text']; $o->props[$term]['html'] = '<a href="'.$link.'" title="'.$title.'">'.$text.'</a>'; $o->props[$term]['link'] = $link; $o->props[$term]['id'] = $id; } if($prop){ return isset($o->props[$term][$prop]) ? $o->props[$term][$prop] : null; } return $o->props[$term]; } // ------------------------------------- private static $_instance; public static function instance(){ if(!isset(self::$_instance)) { self::$_instance = new MyGlobals(); } return self::$_instance; } } endif; // end MyGlobals
MISE À JOUR: Ma questioninitiale a été résolue,mais cela setransformeen une discussion valable sur les raisons dene pas utiliser les variablesglobales,doncje mets àjour la questionpour refléter cela. La solution était
<?php global $category_link_prop; echo esc_url( $category_link_prop ); ?>
comme @TomJNowell l'a suggéré.MISE À JOUR 2: Je l'aimaintenantfaitexactement ce queje voulais. Maisj'utilisetoujours laportéemondialeet je serais heureux detrouver unmeilleurmoyen.
J'essaye demettreen placetout untas de variablesglobalespour lespermaliens vers les catégories à utiliser à diversendroits dansmonthème. La raisonprincipaleen est l'utilisation à lafois dans lanavigationprincipale,ainsi que dans une série de sous-navigations qui sont choisiesen fonction de la catégorie dans laquelle setrouve lemessage actuel. Cen'estpas unthème queje vais être diffusépour être utilisépar d'autres,maisest conçupour un objectiftrès spécifique.
Voici commentje les crée actuellement (jen'ai collé que quelques-unes des variables).
Jepeuxmaintenantfaire
<?php global $prop; echo $prop; ?>
entre les 4endroits qui vontet récupèrenttout le lienpour le code. Lorsque cela change,je n'aibesoin de le changer qu'à un seulendroit. Je suis ouvert aux alternatives quin'impliquentpas laportéeglobale.