Come impostare e utilizzare le variabili globali? O perché non usarli affatto
-
-
Quale collegamentofa questa dichiarazioneechoesc_url ($ category_link_prop);mostra?Qual èiltuo collegamentoprevisto?Which link does this statement echo esc_url( $category_link_prop ); displays ? What is your expected link?
- 1
- 2013-03-04
- Vinod Dalvi
-
Perchénon dovresti usare solo "get_cat_ID (****)" dove haipianificato di usare la variabileglobale.Dubito che ci sarebbe un vantaggio di velocitànelmodoin cui lofai.Dalpunto di vista della leggibilità,"get_cat_ID (****)" vince amanibasse.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
-
Puoi riformulare?Ho letto latua domandae non sono ancora sicuro di cosa vuoifaree perché lo vuoifare.Ilmio consigliogenerale sarebbe dinon utilizzare variabiliglobalie dinoninquinare l'ambitoglobaleCan 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 speravo di ottenereil link alla categoria con laproposta slug '.@VinodDalvi I was hoping to get the link to the category with the slug proposal'.
- 0
- 2013-03-05
- JPollock
-
@TomJNowell Modificheròtra unminutoper riflettere che lo sto usandoper lenavigazioni,in modo che verranno comunque utilizzatipraticamente su qualsiasipagina.@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 ()nonmi cinquetutto ciò di cui hobisogno (cioèil collegamento,iltitolo,ecc.).La leggibilitànon è unagrandepreoccupazioneperme,sarò l'unico a leggere questo.@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
-
questo suona unpo 'come un [X/Y Problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem).forse dovrestifareilbackupe spiegareesattamente qual èil risultato desiderato.Sono certo che ci sia una soluzionemoltopiùelegante rispetto all'impostazione di ungruppo di variabiliglobaliperpoi solo riferimenti hardcode a loroin unnavigatore altrovethis 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 Ottimopunto.Ilmio veroproblema è cheilmiotema ha 4 diversenavigazioni (finora.) 1 che è unabarra superiore standarde 3 che vengono visualizzate soloin base a determinate condizioni.Tuttimostrano combinazioni diverse dipiù omeno le stesse cosee sonoin ordini arbitrarie cambierannomanmano cheilprogetto va avanti.Ilmioproblema è che se li codificoin modo rigido,dovrò codificare la stessa cosapiùe più volte,quindi cambiare la stessa cosa 4 volte ogni volta che qualcosa cambia.@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
-
crea unafunzione che restituiscailtuomenuin base al contesto cheglipassi,in questomodopuoimanteneretutta la logica delmenue le variabili associateincapsulatein un unicoposto.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 È quello con cui hoiniziato,ma so di avere unafunzioneper lanavigazionenellabarra superiore;unafunzioneper unabarra dinavigazione laterale che è appena cresciutafino a 4 diverse versionibasate su condizionali;e unafunzioneper un sub-navin unmodello dipaginae cene saranno altremanmano che andrà avanti.Non riesco atrovare unmodo sano di combinaretutti questielementiin un'unicafunzione.@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 Inoltre voglioesserein grado di usarli come collegamenti a varieparti del sitoneltesto del sito,sianei post (sefunziona) chenei modelli dipagina.@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 risposta
- voti
-
- 2013-03-04
Anche se lo sconsiglio vivamentee non velocizzerà le cose,iltuo utilizzonon è corretto.
WordPressmemorizzagià questielementinella cache degli oggetti,non ènecessariomemorizzareil risultatoe riutilizzarlo,WP lofagià .
Èmoltoprobabile cheiltuo codicefunzionipiù lentamente come risultato di questamicroottimizzazione,nonpiù velocemente!
Come utilizzarei globali
Quando sitenta di utilizzare unglobale,ènecessarioprima specificare laparola chiave
global
. L'hai specificato qui durante la definizione del suo valore,ma al difuori ditale ambito deveesserenuovamente dichiarato come variabile di ambitoglobale.ades.in
functions.php
:function test() { global $hello; $hello = 'hello world'; } add_action( 'after_setup_theme', 'test' );
In
single.php
,questononfunzionerà:echo $hello;
Perché
$hello
non è definito. Tuttavia,funzionerà :global $hello; echo $hello;
Ovviamentenon dovrestifarenessuno dei due. WordPresstentagià dimemorizzare questielementinella cache degli oggetti .
Svantaggie pericoli delle variabiliglobali
Non vedrai alcun aumento di velocitàfacendo questo (potresti vedere unapiccola diminuzione della velocità),tutto ciò che otterrai sarà una complessità aggiuntivae lanecessità di digitaremolte dichiarazioniglobali chenon sononecessarie.
Incontrerai anche altriproblemi:
- codiceper cui èimpossibile scriveretest
- codice che si comportain modo diverso ogni volta che vieneeseguito
- conflittinei nomi delle variabili da uno spazio deinomi condiviso
- bug accidentali dovuti alla dimenticanza di dichiarare
global
- unatotalemancanza di strutturaper l'archiviazione dei dati dei codici
- e molti altri
Cosa dovresti usareinvece?
Farestimeglio a utilizzare dati strutturati,come oggetti oinserimento di dipendenze o,neltuo caso,uninsieme difunzioni.
Variabili statiche
Le variabili statichenon sonobuone,ma considerale come le cugine leggermentemenomalvagie delle variabiliglobali. Le variabili statiche stanno alle variabiliglobali,ciò cheilpane ricoperto difango sta al cianuro.
Adesempio,ecco unmodoperfare qualcosa di similetramite variabili statiche,adesempio
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
I singleton sono come le variabili statiche,tranneperilfatto che la classe contiene una variabile statica con un'istanza di quella classe. Sono dannose quanto le variabiliglobali,solo con una sintassi diversa. Evitali.
WP_Cache,la cosa che haiprovato afarema WP lofagià
Se vuoi davvero risparmiaretempo archiviandoi dati da qualcheparte da riutilizzare,considera l'utilizzo del sistema
WP_Cache
conwp_cache_get
ecc.,adesempio$value = wp_cache_get( 'hello' ); if ( false === $value ) { // not found, set the default value wp_cache_set( 'hello', 'world' ); }
Orail valore verràmemorizzatonella cachepertutta la durata della richiesta da WordPress,verrà visualizzatonegli strumenti di debuge,se si dispone di una cache degli oggetti,persisteràtra le richieste
Nota amargine 1: Vorreinotare che alcunepersone cercano dipersisterei datinelle variabiliglobali attraverso le richieste,ignari delfatto chenon è così chefunziona PHP. A differenza di un'applicazione Node,ogni richiesta carica unanuova copia dell'applicazione,chepoimuore quando la richiesta è completata. Per questomotivo le variabiliglobaliimpostate su una richiestanon sopravvivono alla richiesta successiva
Nota amargine 2: agiudicare dalla domanda aggiornata,letue variabiliglobalinonti danno alcunmiglioramento delleprestazioni. Dovresti semplicementegenerare l'HTML comee quandone haibisognoe funzionerebbe altrettanto velocemente,forse anche unpo 'più velocemente. Questa è lamicroottimizzazione.
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.
-
So che è unpo 'folle usare l'ambitoglobale,ma lamaggiorparte,senontutte,queste variabili verranno utilizzatein ognipagina.Sono aperto aideemigliori.Modificherò la domandaper rendereilmiointento unpo 'più chiaro.Aproposito,funzionaperfettamente quandofaccio ` Phpglobal $ category_link_prop;echoesc_url ($ category_link_prop);?> `come datuo suggerimento.Grazie!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,se lamia soluzionefunziona,potresti contrassegnarla come accettata?Letue variabiliglobali sono veloci quanto la chiamata originale,potrestiprovareinvece a usare lefunzioniin modo danon dover digitare 2 righe,meglio ancora,un singleton,meglio ancora,renderetutto ciò dinamicoe in unparte delmodelloinclusatramiteget_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
-
Contrassegnato come accettato come quello che stofacendo ora,anche sepotrei seguire una delle strategie che @MarkKaplun suggerisce di seguito.Usareget_template_part () è un'ideainteressante,manon sono sicuro di voler avere una directorypiena difilebrevi come quello ...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
-
ooohnononon vorresti unfileper ogni categoria,vorresti solo quello cheprendeilnome della categoria correntee lo usa.Non dovresti dover codificarenulla,immaginailfastidio di codificaretuttooooh 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
-
Hoinseritoil codicenelmio child-functions.php che è attivo.Manonposso accedere alla variabilein unfilephp-include che chiamo da un "normale"postgenerato dal database.Perfavore avvisami,cosafaccio di sbagliato?(Lo definiscoglobale,ovviamente.)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
-
Devi dichiarare "globale" ogni volta che lo usi.Non è un uso una volta chefunziona ovunque,devi usarlo ogni volta,ogni volta,senzaeccezioni di alcuntipo.Ma come ho dettonellamia domanda,le variabiliglobali sono una cattivapratica,problematichee non la soluzione che stai cercando altuoproblema.Ancheilmale che sonoi single sarebbe una soluzionemiglioreYou 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
-
Grazie,apprezzoiltuo commento.L'ho dichiaratoe l'ho usatoma da qualcheparte devo aver commesso unerrore.Semplicementenon hafunzionatoperme.Hoprovato diversi approcci.Finalmente [questo] (https://gist.github.com/aahan/7444046) hafunzionato.Sono d'accordo con quello che dici suiglobali,ma a volte ènecessaria una soluzione rapidaper un sitopersonale.Grazie.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
Non utilizzare variabiliglobali ,così semplice.
Perchénon utilizzare leglobali
Perché l'uso diglobali rendepiù difficile lamanutenzione del software a lungotermine.
- Unglobalepuòessere dichiarato ovunquenel codice,o danessunaparte,quindinon c'èpostoin cuipuoiistintivamenteguardarepertrovare qualche commento su ciòper cui viene utilizzatoilglobale
- Durante la lettura del codice di solitopresumi che le variabili siano locali rispetto allafunzionee non capisci che lamodifica del loro valorein unafunzionepotrebbe avere un cambiamento a livello di sistema.
- Senongestiscono l'input,lefunzioni dovrebbero restituire lo stesso valore/output quando vengono chiamate congli stessiparametri. L'uso di variabiliglobaliin unafunzioneintroduceparametri aggiuntivi chenon sono documentinella dichiarazione dellafunzione.
- leglobalinon hanno alcun costrutto diinizializzazione specificoe quindinonpuoimaiessere sicuro dipoter accedere al valore dellaglobalee non ricevi alcunerrore quando cerchi di accedere allaglobaleprima dell'inizializzazione.
- Qualcun altro (forse unplugin)potrebbe usare le variabiliglobali con lo stessonome,rovinandoiltuo codice otu rovinandoneil contenuto a seconda dell'ordine diinizializzazione.
Il core di WordPress hamolto a chefare con l'uso diglobali. Mentre cerchi di capire comefunzionano lefunzioni dibase come
the_content
,ti rendiimprovvisamente conto che la variabile$more
non è localemaglobalee devi cercarein tuttii file coreper capire quando èimpostato sutrue.Quindi cosa sipuòfare quando siprova a smettere di copiaree incollare diverse righe di codiceinvece dimemorizzareil risultato dellaprimaesecuzionein unglobale? Esistono diversi approcci,funzionalie OOP.
Lafunzione dolcificante. È semplicemente un wrapper/macroper salvareil copia/incolla
// input: $id - the category id // returns: the foo2 value of the category function notaglobal($id) { $a = foo1($id); $b = foo2($a); return $b; }
I vantaggi sono che ora c'è una documentazione su ciò chefailprimoglobale,e hai un ovviopuntoperil debug quandoil valore restituitonon è quello cheti aspetti.
Una volta che hai un dolcificante èfacilememorizzareil risultatonella cache senecessario (fallo solo se scopri che questafunzioneimpiegamoltotempoperessereeseguita)
function notaglobal($id) { static $cache; if (!isset($cache)) { $a = foo1($id); $b = foo2($a); $cache = $b; } return $cache; }
Questoti dà lo stesso comportamento di unglobalema conil vantaggio di avere un'inizializzazione sicura ogni volta che vi accedete.
Puoi averemodelli simili con OOP. Trovo che l'OOP di solitonon aggiunga alcun valore aplugine temi,ma questa è una discussione diversa
class notaglobal { var latestfoo2; __constructor($id) { $a = foo1($id); $this->latestfoo2 = foo2($a) } } $v = new notaglobal($cat_id); echo $v->latestfoo2;
Questo è un codicepiùgoffo,ma se hai diversi valori che vorrestiprecalcolareperché vengono sempre utilizzati,questopuòessere unmodoper andare. Fondamentalmente questo è un oggetto che contienetutte letueglobaliin modo organizzato. Perevitare di rendereglobale un'istanza di questo oggetto (vuoi una solaistanza altrimenti ricalcolii valori)potresti voler usare un pattern singleton (alcunepersone sostengono che sia una cattivaidea,YMMV)
Nonmi piace accedere direttamente all'attributo di un oggetto,quindinelmio codice si deformerà ancora unpo '
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);
-
Perfavore,**nongridare **.Ti dispiace spiegareperchée fornire qualchetipo di citazione?Please, **don't shout**. Mind to explain why and provide some kind of citation?
- 7
- 2013-03-04
- brasofilo
-
Penso chetu abbiafrainteso la risposta.Senon stesse cercando dieseguire un'ottimizzazioneinizialememorizzandoi valoriin variabiliglobali,il suo codice avrebbefunzionato.Ilgrido èperché seguirei principi di sviluppo del software stabiliti dibase è qualcosa chenonpuòessereenfatizzato abbastanza.Lepersone chenon comprendono questiprincipi dibase (disponibilipressoiltuogoogle locale)non dovrebbero diffondere codicein rete.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
-
Ciao,Marco,scusa,ilmio commento è statobreve quanto latua rispostae avrei dovuto chiarirmimeglio: 1) IMO,ilgrassetto è sufficienteperfare unpunto.2) Sebbene a voltenon ci siapiùniente da dire,sospetto che ci sia una riga Risposte: [Vabene pubblicare una risposta di una riga o sarebberomigliori come commenti?] (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
-
si,solo dopo averlopostatomi sono reso conto che avrei dovuto usareilgrassetto.sistemerà quell'assettoyeh, only after I have posted I realized I should have used bold. will fix that asspect
- 0
- 2013-03-04
- Mark Kaplun
-
IMO questa è una risposta,lepersone che vengono qui dagoogle dovrebbero vedere che è una cattivaidea anche solopensare di usare leglobali subito.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
-
Non è sufficiente direnonfare X,devi spiegareperché o sembra chetu lo stia dicendoper capriccioIt'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 Cosafarestiinveceperevitare di dover scrivere la stessa cosa dell'insiemepiùe più volte,e poi dover cambiare ogni cosamanualmente se unaparte diessa cambia?@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,hamodificato la risposta.@JPollock, edited the answer.
- 0
- 2013-03-05
- Mark Kaplun
-
@ TomJNowell,trovo divertente cheio sia stato l'unico a votarenegativamente la domanda stessa,poichéera ovviamente al difuori dell'ambito di WASE.Non ho vistoil valore dell'espansione su un argomento chenon avrebbe dovutoessereiniziato qui.@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 Awesome.Latuaprima soluzione suona come lamigliore.Sperimenterò conil caching,cheprobabilmente sarànecessario.Non sono sicuro delmotivoper cui questoesula dall'ambito di questo scambio di stack?La domanda riguarda PHP,ma si scopre che hatutto a chefare conilmodoin cui WordPresstrattai globali.Ancheil caso è specificoperi menu dinavigazione di 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
-
"Il core di WordPress hamolto damolto amolto uso delleglobali."Direi che Wordpress che ha * qualsiasi *globale è davverotroppe,ma sono soloio."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
-
@MarkKaplungrazieperiltuo approcciofunzionale.Nel casoin cui loprendiamo,potrestifare un aggiornamentopermostrarci come dovrebbe apparire con un valore difallback di $ ID,seper qualchemotivononesistesse,nonfosseimpostato ononfosse unnumerointeropositivo?@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
-
leglobalipossono spessoesserenegativepermolte ragioni,ma lo sono anche lepersone che dicono dinon usaremai leglobali.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
Latua domanda riguardailfunzionamento diphp.
Prendi $ wpdb comeesempio
$ wpdb è unanota variabileglobale.
Sai quando verrà dichiaratoe assegnato con valori?
Ognipagina viene caricata ,sì,ogni volta che visitiiltuo sito wordpress.
Allo stessomodo,devi assicurarti che le variabili che desideriglobalizzare vengano dichiaratee assegnate con valori corrispondenti a ognipagina caricata.
Anche senon sono un designer ditemi,posso dire che after_setup_theme è un hook occasionale.verrà attivato solo quandoiltema è attivato.
Sefossiin te,useròinit o altri hook.No,sefossiin te,non userò affatto le variabiliglobali ...
Non sono davverobravo a spiegare le cose.Quindi,dovrestiprendere un libro se vuoi approfondire 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
Puoi sempre utilizzare unpattern singletontramitegetter statici.
<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
AGGIORNAMENTO: Lamia domanda originale è stata risolta,ma questa si statrasformandoin una discussione valida sulperchénon utilizzare le variabiliglobali,quindi aggiorno la domandaper riflettere questo. La soluzioneera
<?php global $category_link_prop; echo esc_url( $category_link_prop ); ?>
come suggerito da @TomJNowell.AGGIORNAMENTO 2: orafaccioesattamente quello che volevo. Ma utilizzo ancora l'ambitoglobalee sareifelice ditrovare unmodomigliore.
Sto cercando diimpostare uninterogruppo di variabiliglobaliperi permalink alle categorie da utilizzarein varipunti delmiotema. Ilmotivoprincipale di ciò è da utilizzare sianellanavigazioneprincipale,siain una serie di subnavigazioni sceltein base alla categoriain cui sitrovailpost corrente. Questonon è untema chefaròessere rilasciatoperessere utilizzato da altri,ma è stato creatoper uno scopomolto specifico.
È così che le creo attualmente (hoincollato solo alcune variabili).
Orapossoeseguire
<?php global $prop; echo $prop; ?>
nei 4posti che vae recupera l'intero linkperil codice. Quando questo cambia,devo solo cambiarloin unposto. Sono aperto ad alternative chenon coinvolgono l'ambitoglobale.