Como definir e usar variáveis globais? Ou por que não usá-los em tudo
-
-
Qual linkesta declaraçãoechoesc_url ($ category_link_prop);Exibe?Qual é o seu linkesperado?Which link does this statement echo esc_url( $category_link_prop ); displays ? What is your expected link?
- 1
- 2013-03-04
- Vinod Dalvi
-
Por que vocênão usaria apenas 'get_cat_id (****)' onde vocêplanejou usar a variávelglobal.Eu duvido que haveria qualquer vantagem de velocidade dojeito que vocêfazisso.De umponto de vista de legibilidade,'get_cat_id (****)' vence asmãos.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
-
Vocêpode reforçar?Eu li suaperguntae aindanãotenho certeza do que você querfazere por que você querfazerisso.Meu conselhogeral serianão usar variáveisglobaise nãopoluir oescopoglobalCan 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 Euestavaesperandopara obter o linkpara a categoria com aproposta de lesma '.@VinodDalvi I was hoping to get the link to the category with the slug proposal'.
- 0
- 2013-03-05
- JPollock
-
@Tomjnowell Voueditarem umminutopara refletir queestou usandoissoparanavigações,comoeles serão usadosem praticamente qualquerpágina de qualquermaneira.@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 ()nãome cincotudo queeupreciso (ou seja,o link,otítulo,etc.).A legibilidadenão é umaenormepreocupaçãoparamim,serei o único OEN lendoisso.@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
-
Issoestá soando umpouco como um [X/Yproblema] (http://meta.stackexchange.com/Questions/66377/what-is-the-xy-problem).Talvez você devafazer obackupe expliqueexatamente o que é o resultado desejado.Tenho certeza de que há uma soluçãomuitomaiselegante do que definir ummonte de varsglobaispara apenas apenas referências de códigos de códigos aelesem um Navem outro 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
-
@Miloexcelenteponto.Meuproblema real é quemeutematem 4navigações diferentes (até agora) 1 que é umabarra superiorpadrãoe 3 que sóexibem combaseem determinadas condições.Todosmostram diferentes combinações de aproximadamente asmesmas coisase estãoem ordens arbitráriase vãomudar conforme oprojeto continua.Meuproblema é seeu coeie-os,euterei que cópia amesma coisa repetidas vezese,em seguida,mudar amesma coisa 4 vezestoda vez que algomuda.@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
-
Crie umafunção queproduza seumenu combaseno contexto que vocêpassaparaele,dessamaneira vocêpodemantertoda a lógica demenue VARS associadosencapsuladosem um só 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 que é o queeu comecei,mas sei quetenho umafunçãopara anavegação debarra superior;umafunçãopara um Nav Bar Lateral,que apenas cresceupara 4 versões diferentes combaseem condicionais;e umafunçãopara um sub-navem ummodelo depáginae haverámais daqueles queisso acontece.Eunãopossoinventar umamaneira sã de combinartodos aquelesem uma sófunção.@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
-
@Milotambém quero ser capaz de usá-los como linkspara váriaspartes do sitenotexto do site,sejaem posts (seissofuncionar) ouem modelos 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 respostas
- votos
-
- 2013-03-04
Enquantoeu aconselhofortemente contraisso,e isso vai não acelerar as coisas,seu usoestáincorreto.
wordpressjá cacheessas coisasno cache de objeto,vocênãoprecisa armazenar o resultadoe reutilização,WPfazissojá .
Émuitoprovável que seu códigoesteja correndomais lento como resultado dessamicrotimização,nãomais rápido!
Como usar o Globals
Quando vocêtenta usar umglobal,você deveespecificar apalavra-chave
global
primeiro. Você oespecificou aqui ao definir seu valor,masfora desseescopoprecisa ser redecorado como uma variável deescopoglobal.e. Em
functions.php
:function test() { global $hello; $hello = 'hello world'; } add_action( 'after_setup_theme', 'test' );
em
single.php
,issonãofuncionará:echo $hello;
Porque
$hello
éindefinido. Isso,noentanto, vai trabalho:global $hello; echo $hello;
Claro que vocênão devefazernem. wordpressjátenta cacheessas coisasno cache de objeto .
Desvantagense perigos das variáveis globais
Vocênão veránenhum aumento de velocidade defazerisso (vocêpode ver umapequena redução de velocidade),tudo o que receberá é complexidade adicionale anecessidade de digitarmuitas declaraçõesglobais quenão sãonecessárias.
Vocêtambémencontrará outrosproblemas:
- códigoimpossível deescrevertestespara
- código que se comporta deforma diferentetoda vez que éexecutado
- confrontosem nomes variáveis de umespaço denome compartilhado
- bugs acidentaisesquecendo de declarar
global
- umafalta completa deestruturapara o armazenamento de dados dos códigos
- e muitomais
O que você deve usar?
Você seriamelhor usando dadosestruturados,como objetos ouinjeção de dependência,ouno seu caso,um conjunto defunção.
variáveis estáticas
As variáveis estáticasnão sãoboas,maspensamnelas como oprimo ligeiramentemenosmaligno das variáveis globais. Variáveis estáticas sãopara variáveis globais,quepão coberto de lama épara cianeto.
Porexemplo,aquiestá ummeio defazer algo semelhante via variáveis estáticas,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 são como variáveis estáticas,exceto a classe contém uma variávelestática com umainstância dessa classe. Eles sãotão ruins quanto as variáveis globais,apenas com uma sintaxe diferente. Evite-os.
wp_cache,a coisa que vocêtentoufazer,mas o wpjáfazisso
Se você realmente quisereconomizartempo armazenando dadosem algum lugarpara reutilizar,considere usar o sistema
WP_Cache
comwp_cache_get
etc.e.g.$value = wp_cache_get( 'hello' ); if ( false === $value ) { // not found, set the default value wp_cache_set( 'hello', 'world' ); }
Agora,o valor será armazenadoem cachepara a vida da solicitação do WordPress,aparecerem ferramentas de depuraçãoe,se vocêtiver um cache de objeto,elepersistiráentre as solicitações
Sidenote 1: Eunotaria,que algumaspessoastentampersistir dadosem variáveis globaisentrepedidos,inconscientes de quenão é assim que o PHPfunciona. Ao contrário de um aplicativo denó,cada solicitação carrega umanova cópia do aplicativo,queentãomorre quando a solicitação é concluída. Poresta razão,as variáveis globais definidasem uma solicitaçãonão sobrevive àpróxima solicitação
Sidenote 2: Ajulgarpelapergunta atualizada,suas variáveis globaisnão lhe dãonenhumganho de desempenho. Você deve apenasgerar o HTML comoe quando vocêprecisare funcionariatão rápido,talvez até umpoucomais rápido. Esta é amicro-otimização.
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.
-
Eu sei que é umapequenaporcapara usar oescopoglobal,mas amaioria,senem todasessas variáveis serão usadasem todas aspáginas.Estou aberto amelhoresideias.Eu voueditar aperguntaparatornarminhaintenção umpoucomais clara.BTWfuncionaperfeitamentebem quandoeufaço ' Phpglobal $ category_link_prop;echoesc_url ($ category_link_prop);?> `De acordo com sua sugestão.Obrigado!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 seminha soluçãofuncionar,vocêpoderiamarcar como aceito?Suas variáveisglobais sãotão rápidas quantofazendo a chamada original,vocêpode querertentar usarfunçõespara que vocênãoprecise digitar 2 linhas,melhor ainda,um singleton,melhor ainda,tornartudo dinâmicoe em umModeloparteincluída 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
-
Marcado como aceito como é o queestoufazendo agora,emboraeupossair com uma dasestratégias @Markkaplun é sugerindo abaixo.Usando Get_Template_Part () é umaideiainteressante,masnãotenho certeza se queroter um ar cheio de arquivos curtos assim ...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
-
Oooh Não Não,vocênão desejaria um arquivopara cada categoria,vocêgostaria que o quepegue onome da categoria atuale useisso.Vocênão deveter que hartrosnada,imagine oincômodo de hardcodingtudooooh 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
-
Eu coloco o códigonomeufilho-funções.php queestá ativo.Masnão consigo acessar a variávelem um arquivo Incluir PHP que chamo de umpost "normal"geradopelobanco de dados.Porfavor,me avise,o queeufaço deerrado?(Eu defino comoglobal,claro.)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
-
Vocêtem que declarar 'Global'toda vez que você usá-lo.Não é um uso uma veztrabalhaem todos os lugares,vocêtem que usá-lo cada,e detodos ostempos,semexceções de qualquertipo.Mas comoeu digonaminhapergunta,as variáveisglobais sãomauspráticas,problemáticase não a solução que vocêestáprocurandopara o seuproblema.Atémesmo omal que é singletons seria uma soluçãomelhorYou 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
-
Obrigado,agradeço seu comentário.Eu declareie usei,masem algum lugar devoter cometido umerro.Apenasnãofuncionouparamim.Eutentei abordagens diferentes.Finalmente [este] (https://gist.github.com/aahan/7444046)funcionou.Concordo com o que você diznosglobais,mas às vezes uma solução rápida énecessáriapara um sitepessoal.Obrigado.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ão use variáveis globais ,tão simples quantoisso.
por quenão usarglobals
Porque o uso deglobaistornamais difícilmanter o software a longoprazo.
- umglobalpode ser declaradoem qualquer lugarno código,ouem nenhum lugar,portanto,não há lugarno qual vocêpode desistir deencontrar algum comentário sobre o que o Global é usadopara
- durante a leitura de código vocêgeralmente assume que as variáveis são locaispara afunçãoe nãoentendem que a alteração de seu valorem umafunçãopodeter umamudança de largura do sistema.
- Seelesnão lidarem deentrada,asfunções devem retornar omesmo valor/saída quandoeles são chamados com osmesmosparâmetros. O uso deglobaisem umafunçãointroduzparâmetros adicionais quenão são documentosna declaração defunção.
- Globalsnãotêmnenhuma construção deinicializaçãoespecíficae,portanto,vocênuncapodeter certeza de quepode acessar o valor do Global,e vocênão recebenenhumerro aotentar acessar oglobal antes dainicialização.
- outrapessoa (umplugintalvez)pode usar o Globals com omesmonome,arruinando seu código,ou você arruinando seu dependendo da ordem deinicialização.
WordPress Núcleotem muito uso demuito uso deglobais. Aotentarentender comofunçõesbásicas como
the_content
trabalho,vocêpercebe de repente que o$more
variávelnão é local,masglobale precisapesquisartodos os arquivosprincipaisparaentender quando é definido comotrue.Então,o quepode serfeito aotentarparar de copiare amp; colando várias linhas de códigoem vez de armazenar oprimeiro resultadoem ummundoglobal? Existem várias abordagens,funcionale oop.
Afunção adoçante. É simplesmente um wrapper/macropara salvar a cópia/pasta p>
// input: $id - the category id // returns: the foo2 value of the category function notaglobal($id) { $a = foo1($id); $b = foo2($a); return $b; }
Osbenefícios são que agora há uma documentaçãopara o que o antigoglobalfaz,e vocêtem umponto óbviopara depurar quando o valor que é retornadonão é o que vocêespera.
Depois deter um adoçante,éfácil cache o resultado,senecessário (faça-o somente se descobrir queestafunção demoramuitotempoparaexecutar)
function notaglobal($id) { static $cache; if (!isset($cache)) { $a = foo1($id); $b = foo2($a); $cache = $b; } return $cache; }
Isso dá-lhe omesmo comportamento de umglobal,mas com a vantagem deter umainicialização asseguradatoda vez que você o acessar.
Vocêpodeterpadrões semelhantes com o OOP. Eu acho que o OOPgeralmentenão adicionanenhum valorem pluginse temas,masesta é uma discussão diferente
class notaglobal { var latestfoo2; __constructor($id) { $a = foo1($id); $this->latestfoo2 = foo2($a) } } $v = new notaglobal($cat_id); echo $v->latestfoo2;
Este é um código desajeitado,mas se vocêtiver vários valores quegostaria deprecomputarporqueelesestão sempre sendo usados,issopode ser umamaneira deir. Basicamente,este é um objeto que contémtodos osglobais demaneira organizada. Paraevitar umainstância deste objeto umglobal (você deseja que umainstância,caso contrário,você recompute os valores),pode querer usar um padrão singleton (algumaspessoas argumentam é umamáideia,Ymmv)
Eunãogosto de acessar um atributo de objeto diretamente,entãonomeu código,elefarpeçamais alguns
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,**nãogrite **.Menteparaexplicarpor quee fornecer algumtipo de citação?Please, **don't shout**. Mind to explain why and provide some kind of citation?
- 7
- 2013-03-04
- brasofilo
-
Eu acho que vocêentendeumal a resposta.Seelenãoestavatentandofazer a otimização antecipada,armazenando valoresem variáveisglobais,seu códigoteriafuncionado.Ogrito éporque seguir osprincípiosbásicos de desenvolvimento de softwareestabelecidos é algo quenãopode serenfatizado o suficiente.Aspessoas quenãoentendemessesprincípiosbásicos (disponíveisno seu Google local)não devemespalhar código sobre a rede.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
-
Oi,Mark,desculpas,meu comentáriofoitão curto quanto sua respostae eu deveriame tornarmais claro: 1)imo,negrito é suficienteparafazer umponto.2) Embora às vezesnão hámaisnada a dizer,eu suspeito de uma linha respostas: [tudobem parapostar uma resposta de uma linha,ou aqueles seriammelhores como comentários?] (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ó depois queeupostei,percebi que deveriater usado ousado.vai corrigirisso asspectyeh, only after I have posted I realized I should have used bold. will fix that asspect
- 0
- 2013-03-04
- Mark Kaplun
-
IMO Esta é uma resposta,aspessoas que vêm aquiformam o Google devem ver que é umamáideiapensarem usar o Globalsimediatamente.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
-
Não é o suficientepara dizernãofazer x,vocêtem queexplicarpor que ou vocêparece que vocêestá dizendoissoem um 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 o que vocêfariaem vez deevitarter queescrever omesmo conjunto de várias vezese depoister quemudar cada ummanualmente se algumaparte deelemudar?@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,editou a resposta.@JPollock, edited the answer.
- 0
- 2013-03-05
- Mark Kaplun
-
@TOMJ NOVELHO,achoengraçado queeuera o único a queda da questãoem si,comoera obviamentefora doescopo do WASE.Eunão vi o valor deexpandir um assunto quenão deveriater sidoiniciado aqui.@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
-
@Markkaplunincrível.Suaprimeira solução soa como omelhor.Euexperimentarei o cache,queprovavelmente seránecessário.Eunãotenho certezaporqueissoestáfora doescopo deste StackExchange?A questão é sobre o PHP,mas acontece quetem tudo a ver com aforma como o WordPress lida com osglobais.Também o caso éespecíficoparamenus denavegação 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
-
"Onúcleo do WordPresstem muito uso demuito amuito uso deglobais."Eu diria que o WordPresstendo * qualquer * Globals é demais,mas é sóeu."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
-
@Markkaplun Obrigadopela sua abordagemfuncional.No caso de levá-lo,vocêpoderiafazer uma atualizaçãoparanosmostrar como separece com um valor defallback de $ ID,sepor algummotivonãoexistisse,nãofoi definido ounãoera uminteiropositivo?@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
-
Globalsmuitas vezespodem ser ruinspormuitas razões,mas aspessoas que dizemnunca usarglobais.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
Suaperguntaestáenvolvida com como o PHPfunciona.
Tome $ wpdb comoexemplo
$ wpdb é uma variávelglobalbem conhecida.
Você sabe quando será declaradoe atribuído com valores?
cadapágina carregada ,sim,toda vez que você visitar seu site WordPress.
Damesmaforma,vocêprecisater certeza de queessas variáveis que deseja serglobalizadas serão declaradase atribuídas com valores correspondentes a cadapágina carregada.
Emboraeunão seja um designertemático,posso dizer que o After_Setup_theme é umgancho detempo.Ele só será desencadeado quando otema ativado.
Seeufosse você,vou usarinit ou outrosganchos.Não,seeufosse você,não usarei variáveisglobais ...
Eunão sou realmentebomem explicar as coisas.Então,você devepegar um livro se quisermergulharno 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
Você semprepode usar umpadrão de singleton viagettersestá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
update: minhapergunta originalfoi resolvida,masissoestá setransformandoem uma discussão válida sobrepor quenão usar variáveis globais,entãoestou atualizando aperguntapara refletirisso. A soluçãofoi
<?php global $category_link_prop; echo esc_url( $category_link_prop ); ?>
como @tomjnowell sugerido.update 2: Eu agoratenhoissofazendoexatamente o queeu queria. Maseu aindaestou usando oescopoglobale ficariafelizem encontrar umamaneiramelhor.
Euestoutentando configurar ummonte de variáveis globaispara os Permalinkspara categorias a serem usadasem vários lugaresnomeutema. Aprincipal razãoparaisso épara usoem ambas asprincipaisnavegações,bem comoem uma série de subnavegações que sãoescolhidas combaseem qual categoria opost atualestáem. Issonão é umtema queeu liberar-separa usopor outros,mas é construídopara umafinalidademuitoespecífica.
É assim queestou criando-os atualmente (eu só coloiem algumas das variáveis).
Agoraeupossofazer
<?php global $prop; echo $prop; ?>
int ele 4 lugares que vãoe recebem o linkinteiropara o código. Quandoissomuda,sópreciso alterá-loem um só lugar. Estou aberto a alternativas quenãoenvolvem oescopoglobal.