¿Cómo configurar y usar variables globales? O por qué no usarlos en absoluto
-
-
¿Quéenlace haceecoesta declaraciónesc_url ($ category_link_prop);muestra?¿Cuáles su vínculoesperado?Which link does this statement echo esc_url( $category_link_prop ); displays ? What is your expected link?
- 1
- 2013-03-04
- Vinod Dalvi
-
¿Por quéno usaría simplemente 'get_cat_ID (****)' donde alguna vezplaneó usar la variableglobal?Dudo que haya alguna ventaja de velocidad de laformaen que lo haces.Desdeelpunto de vista de la legibilidad,'get_cat_ID (****)'gana sin lugar a dudas.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
-
¿Puedes reformular?Leítupregunta ytodavíanoestoy seguro de lo que quieres hacer ypor qué quieres hacerlo.Mi consejogeneral seríano utilizar variablesglobales yno contaminarel alcanceglobal.Can 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 Esperaba obtenerelenlace a la categoría con lapropuesta de slug '.@VinodDalvi I was hoping to get the link to the category with the slug proposal'.
- 0
- 2013-03-05
- JPollock
-
@TomJNowell Editaréen unminutopara reflejar queestoy usandoestopara lasnavegaciones,por lo que se usaránen casi cualquierpágina detodosmodos.@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 ()nome datodo lo quenecesito (es decir,elenlace,eltítulo,etc.).La legibilidadnoes unagranpreocupaciónparamí,seréel único que leaesto.@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
-
esto suena unpoco como un [Problema X/Y] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem).tal vez debería retroceder yexplicarexactamente cuálesel resultado deseado.Estoy seguro de que hay una soluciónmuchomáselegante que configurar unmontón de variablesglobalespara luego codificar referenciasen unnavegadoren otro lugarthis 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 Excelentepunto.Miproblema reales quemi tematiene 4navegaciones diferentes (hasta ahora). 1 quees unabarra superiorestándar y 3 que solo semuestran según ciertas condiciones.Todosmuestran diferentes combinaciones de aproximadamente lasmismas cosas yestánen órdenes arbitrarios y van a cambiar amedida que avanzaelproyecto.Miproblemaes que si los codifico,tendré que codificar lomismo una y otra vez,y luego cambiar lomismo 4 veces cada vez que algo cambie.@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
-
cree unafunción quegenere sumenúen función del contexto que lepasa,deesamanerapuedemantenertoda la lógica delmenú y las variables asociadasencapsuladasen un solo lugar.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 Conesoempecé,pero sé quetengo unafunciónpara lanavegación de labarra superior;unafunciónpara unabarra lateral denavegación que acaba de crecer a 4 versiones diferentesbasadasen condicionales;y unafunciónpara una subnavegaciónen unaplantilla depágina y habrámás deesas amedida que avanza.No seme ocurre unaforma sensata de combinartodoesoen una solafunción.@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 También quieropoder usarlos comoenlaces a variaspartes del sitioen eltexto del sitio,ya seaen publicaciones (siesofunciona) oen plantillas depágina.@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 respuestas
- votos
-
- 2013-03-04
Sibien desaconsejoesto,y no acelerará las cosas,su usoesincorrecto.
WordPress ya almacenaen cachéestas cosasen la caché de objetos,nonecesitas almacenarel resultado y reutilizarlo,WP ya lo hace .
Esmuyprobable que su código seestéejecutandomás lento como resultado deestamicrooptimización,¡nomás rápido!
Cómo utilizarglobales
Cuandointente utilizar unglobal,primero debeespecificar lapalabra clave
global
. Loespecificó aquí al definir su valor,perofuera deese alcance,debe volver a declararse como una variable de alcanceglobal.p.ej.en
functions.php
:function test() { global $hello; $hello = 'hello world'; } add_action( 'after_setup_theme', 'test' );
En
single.php
,estonofuncionará:echo $hello;
Porque
$hello
noestá definido. Sinembargo,esto funcionará :global $hello; echo $hello;
Por supuesto queno deberías hacerninguna de las dos cosas. WordPress yaintenta almacenaren cachéestas cosasen la caché de objetos .
Desventajas ypeligros de las variablesglobales
No veráningún aumento de velocidad al haceresto (puede ver unapequeña disminución de velocidad),todo lo que obtendráes complejidad adicional y lanecesidad deescribirmuchas declaracionesglobales queno sonnecesarias.
Tambiénencontrará otrosproblemas:
- códigoparael queesimposibleescribirpruebas
- código que se comporta demanera diferente cada vez que seejecuta
- conflictosen losnombres de las variables de unespacio denombres compartido
- errores accidentalespor olvidar declarar
global
- unafaltatotal deestructuraparael almacenamiento de datos de sus códigos
- ymuchosmás
¿Qué debería usaren su lugar?
Seríamejor que utilizara datosestructurados,como objetos oinyección de dependencia,oen su caso,un conjunto defunciones.
Variablesestáticas
Las variablesestáticasno sonbuenas,peropienseen ellas comoelprimo unpocomenosmalvado de las variablesglobales. Las variablesestáticas sonpara variablesglobales,lo queelpan cubierto debarroespara cianuro.
Porejemplo,aquí hay unaforma de hacer algo similarmediante variablesestáticas,p.ej.
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
Los singleton son como variablesestáticas,excepto que la clase contiene una variableestática con unainstancia deesa clase. Sontanmalos como las variablesglobales,solo que con una sintaxis diferente. Evítalos.
WP_Cache,lo queintentó hacer,pero WP ya lo hace
Si realmente desea ahorrartiempo almacenando datosen algún lugarpara reutilizarlos,considere usarel sistema
WP_Cache
conwp_cache_get
,etc.,porejemplo,$value = wp_cache_get( 'hello' ); if ( false === $value ) { // not found, set the default value wp_cache_set( 'hello', 'world' ); }
Ahorael valor se almacenaráen caché durante la duración de la solicitud de WordPress,semostraráen las herramientas de depuración y,sitiene una caché de objetos,persistiráen todas las solicitudes
Nota almargen 1: Megustaría señalar que algunaspersonasintentan conservar datosen variablesglobales através de solicitudes,sin saber quenoes así comofunciona PHP. A diferencia de una aplicación denodo,cada solicitud carga una copianueva de la aplicación,que luegomuere cuando se completa la solicitud. Poresta razón,las variablesglobalesestablecidasen una solicitudno sobreviven a la siguiente solicitud
Nota almargen 2: ajuzgarpor lapregunta actualizada,sus variablesglobalesno lebrindanningunaganancia de rendimiento. Deberíagenerarel HTML cuando lonecesite y seejecutaráigual de rápido,quizásincluso unpoquitomás rápido. Estaes lamicrooptimización.
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.
-
Sé quees unpoco loco usarel alcanceglobal,pero lamayoría,sinotodas,estas variables se usaránen cadapágina.Estoy abierto amejoresideas.Voy aeditar lapreguntapara aclarar unpocomi intención.Por cierto,funcionaperfectamentebien cuando hago ` Phpglobal $ category_link_prop;echoesc_url ($ category_link_prop);?> `según su sugerencia.¡Gracias!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,simi soluciónfunciona,¿podríamarcar como aceptada?Sus variablesglobales sontan rápidas como hacer la llamada original,esposible que deseeprobaren su lugar usandofuncionespara quenonecesiteescribir 2 líneas,mejor aún,un singleton,mejor aún,hagatodoeso dinámico yen unparte de laplantillaincluida através deget_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
-
Marcado como aceptado comoes lo queestoy haciendo ahora,aunquepuedo seguir una de lasestrategias que @MarkKaplun sugiere a continuación.Usarget_template_part ()es unaideainteresante,peronoestoy seguro de querertener un directorio lleno de archivos cortos comoese ...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
-
ooohnono,no querría un archivopara cada categoría,solo querríael quetomaelnombre de la categoría actual y lo usa.No deberíatener que codificarnada,imagine lamolestia de codificarlotodooooh 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
-
Pongoel códigoen mi child-functions.php queestá activo.Peronopuedo acceder a la variableen un archivophp-include que llamo desde unapublicación "normal"generadapor unabase de datos.Porfavor avíseme,¿qué hagomal?(Lo defino comoglobal,por supuesto).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
-
Tienes que declarar `global` cada vez que lo uses.Noes un asunto de uso una vez quefuncionaen todaspartes,debe usarlotodas y cada una de las veces,sinexcepciones deningúntipo.Pero como digoen mipregunta,las variablesglobales son unamalapráctica,problemáticas yno la solución queestábuscandopara suproblema.Inclusoelmal quees singleton sería unamejor soluciónYou 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
-
Gracias,agradezcotu comentario.Lo declaré y lo usé,peroen algún lugar debí haber cometido unerror.Simplementenofuncionóparamí.Probé diferentesenfoques.Finalmente [este] (https://gist.github.com/aahan/7444046)funcionó.Estoy de acuerdo con lo que dice sobre losglobales,pero a veces senecesita una solución rápidapara un sitiopersonal.Gracias.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
No use variablesglobales ,tan simple comoeso.
Por quéno utilizarglobales
Porqueel uso deglobales dificultaelmantenimiento del software a largoplazo.
- Unglobal sepuede declararen cualquierparte del código,oen ningún lugar,por lotanto,no hayningún lugaren el quepuedasmirarinstintivamenteparaencontrar algún comentario sobrepara qué se usaelglobal
- Al leerel código,generalmente asume que las variables son locales de lafunción yno comprende que cambiar su valoren unafunciónpodríatener un cambioen todoel sistema.
- Sinomanejan laentrada,lasfunciones deben devolverelmismo valor/salida cuando se llaman con losmismosparámetros. El uso deglobalesen unafunciónintroduceparámetros adicionales queno se documentanen la declaración de lafunción.
- losglobalesnotienen ninguna construcción deinicializaciónespecífica y,por lotanto,nuncapuedeestar seguro de cuándopuede acceder al valor delglobal,yno obtieneningúnerror alintentar acceder alglobal antes de lainicialización.
- Alguienmás (un complementotal vez)podría usarglobales conelmismonombre,arruinando su código o usted arruinando su dependiendo del orden deinicialización.
Elnúcleo de WordPresstiene mucho uso de losglobales. Mientrasintenta comprender cómofuncionan lasfuncionesbásicas como
the_content
,de repente se da cuenta de que la variable$more
noes local sinoglobal ynecesitabuscaren todos los archivosprincipalespara comprender cuándo ¿Estáestablecidoen verdadero?Entonces,¿qué sepuede hacer cuando seintenta dejar de copiar ypegar varias líneas de códigoen lugar de almacenarel resultado de laprimeraejecuciónen unglobal? Hay variosenfoques,funcionales y OOP.
Lafunciónedulcorante. Es simplemente un contenedor/macroparaguardar la copia/pegar
// input: $id - the category id // returns: the foo2 value of the category function notaglobal($id) { $a = foo1($id); $b = foo2($a); return $b; }
Losbeneficios son que ahora hay una documentación de lo que haceel anteriorglobal,ytiene unpunto obviopara depurar cuandoel valor que se devuelvenoeselesperado.
Una vez quetenga unedulcorante,esfácil almacenaren cachéel resultado siesnecesario (hágalo solo si descubre queestafuncióntardamuchoen ejecutarse)
function notaglobal($id) { static $cache; if (!isset($cache)) { $a = foo1($id); $b = foo2($a); $cache = $b; } return $cache; }
Estote daelmismo comportamiento de unglobalpero con la ventaja detener unainicialización asegurada cada vez que accedes a él.
Puedetenerpatrones similares con OOP. Encuentro que OOPgeneralmenteno agreganingún valoren complementos ytemas,peroestaes una discusión diferente
class notaglobal { var latestfoo2; __constructor($id) { $a = foo1($id); $this->latestfoo2 = foo2($a) } } $v = new notaglobal($cat_id); echo $v->latestfoo2;
Estees un códigomástorpe,pero sitiene varios valores que legustaríaprecalcularporque siempre seestán usando,estepuede ser un camino a seguir. Básicamente,estees un objeto que contienetodos susglobales deforma organizada. Paraevitar que unainstancia deeste objeto seaglobal (deseaen unainstancia,de lo contrario,vuelva a calcular los valores),esposible que desee utilizar un patrón singleton (algunaspersonas argumentan quees unamalaidea,YMMV)
Nome gusta acceder a un atributo de objeto directamente,por lo queen mi código se deformará unpocomás
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);
-
Porfavor,**nogrites **.¿Leimportaríaexplicarpor qué yproporcionar algúntipo de cita?Please, **don't shout**. Mind to explain why and provide some kind of citation?
- 7
- 2013-03-04
- brasofilo
-
Creo queentendistemal la respuesta.Sinoestuvieratratando de hacer una optimizacióntemprana almacenando valoresen variablesglobales,su código habríafuncionado.Elgrito se debe a que seguir losprincipiosbásicos de desarrollo de softwareestablecidoses algo queno sepuedeenfatizar lo suficiente.Laspersonas queno comprendenesosprincipiosbásicos (disponiblesen sugoogle local)no deben difundirel códigoen la red.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
-
Hola,Mark,disculpas,mi comentariofuetanbreve comotu respuesta y debería sermás claro: 1) Enmi opinión,lanegritaes suficientepara hacer unpunto.2) Aunque a vecesno haynadamás que decir,sospecho que hay respuestas de una línea: [¿Estábien publicar una respuesta de una línea o seríamejor como comentarios?] (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
-
sí,solo después de haberpublicadome di cuenta de que debería haber usadonegrita.arreglaráese aspectoyeh, only after I have posted I realized I should have used bold. will fix that asspect
- 0
- 2013-03-04
- Mark Kaplun
-
Enmi opinión,estaes una respuesta,laspersonas que vienen aquí desde Google deberían ver quees unamalaideainclusopensaren usarglobales deinmediato.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
-
Noes suficiente decir queno hagas X,tienes queexplicarpor qué oparece que loestás diciendopor caprichoIt'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 ¿Qué haríasen su lugarparaevitartener queescribirelmismo conjunto una y otra vez,y luegotener que cambiar cada unomanualmente si algunaparte 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,editó la respuesta.@JPollock, edited the answer.
- 0
- 2013-03-05
- Mark Kaplun
-
@TomJNowell,me parecegracioso que yofuerael único que rechazó lapreguntaen sí,ya que obviamenteestabafuera del alcance de WASE.No viel valor de ampliar untema queno debería haber comenzado aquíen absoluto.@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 Impresionante.Suprimera soluciónparece lamejor.Experimentaré conel almacenamientoen caché,queprobablemente seanecesario.Noestoy seguro depor quéestoestáfuera del alcance deeste stackexchange.Lapreguntaes sobre PHP,pero resulta quetiene mucho que ver con cómo WordPressmaneja losglobales.Tambiénel casoesespecífico de losmenús denavegación de 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
-
"Elnúcleo de WordPresstiene mucho uso de losglobales".Yo diría que Wordpresstiene * cualquier *globales demasiado,peroese soy yo."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
-
@MarkKaplungraciaspor suenfoquefuncional.Enel caso de que lotomemos,¿podría hacer una actualizaciónparamostrarnos cómo debería verse con un valor de respaldo de $ ID,sipor alguna razónnoexistía,noestaba configurado onoera unenteropositivo?@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
-
Losglobales amenudopueden sermalospormuchas razones,perotambién lo son laspersonas que dicen quenunca useglobales.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
Supreguntaestá relacionada conelfuncionamiento dephp.
Tome $ wpdb comoejemplo
$ wpdb es una variableglobal conocida.
¿Sabe cuándo se declarará y se le asignarán valores?
Cadapágina cargada ,sí,cada vez que visita su sitio de wordpress.
Demanera similar,debe asegurarse de que las variables que deseaglobalizar se declaren y se les asignen los valores correspondientesen cadapágina cargada.
Aunqueno soy un diseñador detemas,puedo decir que after_setup_themees unganchotemporal.solo se activará cuando se activeeltema.
Sifuera usted,usaríainit u otrosganchos.No,si yofuera usted,no usaría variablesglobalesen absoluto ...
Realmenteno soybuenoparaexplicar cosas.Por lotanto,debeelegir un libro si deseaprofundizaren 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
Siemprepuedes usar unpatrón singleton através degettersestáticos.
<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
ACTUALIZACIÓN: Mipregunta original ha sido resuelta,peroesto seestá convirtiendoen una discusión válida sobrepor quéno usar variablesglobales,así queestoy actualizando lapreguntapara reflejareso. La soluciónfue
<?php global $category_link_prop; echo esc_url( $category_link_prop ); ?>
como sugirió @TomJNowell.ACTUALIZACIÓN 2: ahora lotengo haciendoexactamente lo que quería. Pero sigo usandoel alcanceglobal yestaríafeliz deencontrar unamejormanera.
Estoytratando de configurar unmontón de variablesglobalespara losenlacespermanentes a categorías que se utilizaránen varios lugares demi tema. La razónprincipal deestoes que se usatantoen lanavegaciónprincipal comoen una serie de sub-navegaciones que seeligenen función de la categoríaen la que seencuentra lapublicación actual. Estenoes untema que se lanzarápara que lo usen otros,peroestá diseñadopara unpropósitomuyespecífico.
Asíes como losestoy creando actualmente (solo hepegado algunas de las variables).
Ahorapuedo hacer
<?php global $prop; echo $prop; ?>
en los 4 lugares que van y recuperarelenlace completoparael código. Cuandoeso cambie,solonecesito cambiarloen un lugar. Estoy abierto a alternativas quenoinvolucranel alcanceglobal.