Wie setze und verwende ich globale Variablen? Oder warum nicht überhaupt verwenden
-
-
Welchen Linkgibt diese Anweisung wieder? Esc_url ($ category_link_prop);Displays?Wasist Ihrerwarteter Link?Which link does this statement echo esc_url( $category_link_prop ); displays ? What is your expected link?
- 1
- 2013-03-04
- Vinod Dalvi
-
Warum sollten Sienichteinfach 'get_cat_ID (****)' verwenden,woimmer Sie dieglobale Variable verwenden wollten?Ichbezweifle,dasseseinen Geschwindigkeitsvorteilgeben würde,wie Sieestun.Unter dem Gesichtspunkt der Lesbarkeitgewinnt 'get_cat_ID (****)' zweifellos.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
-
Können Sie umformulieren?Ich habe Ihre Fragegelesen undbin mirimmernochnicht sicher,was Sietunmöchten und warum Sieestunmöchten.Mein allgemeiner Rat wäre,keineglobalen Variablen zu verwenden und denglobalen Geltungsbereichnicht zu verschmutzenCan 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 Ich hattegehofft,den Link zu der Kategoriemit dem Schneckenvorschlag zubekommen '.@VinodDalvi I was hoping to get the link to the category with the slug proposal'.
- 0
- 2013-03-05
- JPollock
-
@TomJNowell Ich werdein einer Minutebearbeiten,um zu reflektieren,dassich diesfür die Navigation verwende,so dass sie sowieso auf so ziemlichjeder Seite verwendet werden.@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 ()gibt mirnicht alles,wasichbrauche (dh den Link,den Titel usw.).Die Lesbarkeitistfürmich keingroßes Problem,ich werde dereinzige sein,der dies liest.@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
-
Dies klingtein bisschen wieein [X/Y-Problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem).Vielleicht sollten Sie sichern undgenauerklären,was Ihrgewünschtes Ergebnisist.Ichbin mir sicher,dasseseine weitauselegantere Lösunggibt,alseine Reiheglobaler Variablen soeinzustellen,dassnur Verweise auf siein einem Navi an anderer Stellefest codiert werdenthis 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 Ausgezeichneter Punkt.Meineigentliches Problemist,dassmein Thema (bisher) 4 verschiedene Navigationen hat. 1isteine Standard-Oberleiste und 3 wirdnur unterbestimmten Bedingungen angezeigt.Sie alle zeigen unterschiedliche Kombinationen von ungefähr dengleichen Dingen und sindin willkürlicher Reihenfolge und werden sichim Verlauf des Projekts ändern.Mein Problemist,wennich sie hart codiere,mussichimmer undimmer wieder dasselbe hartcodieren und dannjedes Mal,wenn sichetwas ändert,dasselbe viermal ändern.@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
-
Erstellen Sieeine Funktion,die Ihr Menübasierend auf dem Kontext ausgibt,den Sie anes übergeben. Auf diese Weise können Sie diegesamte Menülogik und die zugehörigen Variablen aneinem Ort kapseln.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 Damit habeich angefangen,aberich weiß,dassicheine Funktionfür die Navigationin der oberen Leiste habe.eine Funktionfürein Seitenleisten-Navi,dasgerade auf 4 verschiedene Versionenbasierend auf Bedingungen angewachsenist;undeine Funktionfürein Sub-Naviin einer Seitenvorlage,von denenesim Laufe der Zeit weiteregeben wird.Ich kannmir keine vernünftige Methode ausdenken,um all diese Funktionenin einer Funktion zu kombinieren.@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 Außerdemmöchteich diese als Links zu verschiedenen Teilen der Siteim Text der Site verwenden können,entwederin Posts (falls diesfunktioniert) oderin Seitenvorlagen.@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 Antworten
- Stimmen
-
- 2013-03-04
Ich rate zwar dringend davon ab undes wird nicht die Dingebeschleunigen,aber Ihre Verwendungistfalsch.
WordPress speichert diese Dingebereitsim Objektcache. Siemüssen das Ergebnisnicht speichern und wiederverwenden. WPerledigt diesbereits .
Esist sehr wahrscheinlich,dass Ihr Code aufgrund dieser Mikrooptimierung langsamer läuft,nicht schneller!
Verwendung von Globals
Wenn Sie versuchen,ein globales Schlüsselwort zu verwenden,müssen Sie zuerst das Schlüsselwort
z.B.inglobal
angeben. Sie habenes hierbei der Definition seines Werts angegeben,aber außerhalb dieses Bereichsmusses alsglobale Bereichsvariableneu deklariert werden.functions.php
:function test() { global $hello; $hello = 'hello world'; } add_action( 'after_setup_theme', 'test' );
In
single.php
funktioniert diesnicht:echo $hello;
Weil
$hello
undefiniertist. Diesfunktioniertjedoch :global $hello; echo $hello;
Natürlich sollten Siebeidesnichttun. WordPress versuchtbereits,diese Dingeim Objektcache zwischenzuspeichern.
Nachteile und Gefahrenglobaler Variablen
Sie werden dabei keine Geschwindigkeitssteigerungfeststellen (möglicherweiseeine geringfügige Geschwindigkeitsabnahme). Sieerhalten lediglich zusätzliche Komplexität und die Notwendigkeit,vieleglobale Deklarationeneinzugeben,dienichterforderlich sind.
Sie werden auch auf andere Probleme stoßen:
- Code,für denes unmöglichist,Testsfür zu schreiben
- Code,der sichbei jeder Ausführung anders verhält
- kollidiertin Variablennamen auseinem gemeinsamgenutzten Namensraum
- versehentliche Fehlerbeim Vergessen,
global
zu deklarieren
- ein völliger Mangel an Strukturfür Ihre Codedatenspeicherung
- und vielemehr
Was sollten Sie stattdessen verwenden?
Verwenden Siebesser strukturierte Daten wie Objekte oder Abhängigkeitsinjektion oderin Ihrem Falleine Reihe von Funktionen.
Statische Variablen
Statische Variablen sindnichtgut,aberbetrachten Sie sie als denetwas wenigerbösen Cousinglobaler Variablen. Statische Variablen sindglobale Variablen,schlammbedecktes Brot Cyanid.
Hieristbeispielsweiseein Mittel,umetwas Ähnliches über statische Variablen zutun,z. B.
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 sind wie statische Variablen,außer dass die Klasseeine statische Variablemit einer Instanz dieser Klasseenthält. Sie sindgenauso schlecht wieglobale Variablen,nurmit unterschiedlicher Syntax. Vermeiden Sie sie.
WP_Cache,das,was Sie versucht haben,aber WPtutesbereits
Wenn Sie wirklich Zeit sparenmöchten,indem Sie Daten zur Wiederverwendung aneinem Ort speichern,sollten Sie das System
WP_Cache
mitwp_cache_get
usw. verwenden,z. B.$value = wp_cache_get( 'hello' ); if ( false === $value ) { // not found, set the default value wp_cache_set( 'hello', 'world' ); }
Jetzt wird der Wertfür die Dauer der Anforderung von WordPress zwischengespeichert,in Debugging-Tools angezeigt und wenn Sieeinen Objekt-Cache haben,bleibt dieser über Anforderungen hinwegbestehen
Nebenbemerkung 1: Ichmöchte darauf hinweisen,dasseinige Leute versuchen,Datenin globalen Variablen über Anforderungen hinwegbeizubehalten,ohne zu wissen,dass PHP sonichtfunktioniert. Im Gegensatz zueiner Knotenanwendung lädtjede Anforderungeine neue Kopie der Anwendung,die dann stirbt,wenn die Anforderung abgeschlossenist. Aus diesem Grund überlebenglobale Variablen,diefüreine Anforderungfestgelegt wurden,nichtbis zurnächsten Anforderung
Nebenbemerkung 2: Nach der aktualisierten Frage zu urteilen,bringen Ihnen Ihreglobalen Variablen überhaupt keinen Leistungsgewinn. Sie sollten den HTML-Codeeinfachnach Bedarfgenerieren under würdegenauso schnell ausgeführt,vielleicht sogarein kleinesbisschen schneller. Diesisteine Mikrooptimierung.
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.
-
Ich weiß,dassesein bisschen verrücktist,denglobalen Bereich zu verwenden,aber diemeisten,wennnicht alle dieser Variablen werden aufjeder Seite verwendet.Ichbin offenfürbessere Ideen.Ich werde die Fragebearbeiten,ummeine Absichtein wenig klarer zumachen.Übrigensfunktionierteseinwandfrei,wennich ` Phpglobal $ category_link_prop;echoesc_url ($ category_link_prop);?> `gemäß Ihrem Vorschlag.Vielen Dank!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,wennmeine Lösungfunktioniert,können Sie sie als akzeptiertmarkieren?Ihreglobalen Variablen sindgenauso schnell wie der ursprüngliche Aufruf. Vielleichtmöchten Sie stattdessen Funktionen verwenden,damit Sienicht zwei Zeileneingeben müssen,nochbesser,ein Singleton,nochbesser,machen Sie all das dynamisch undin einemVorlagenteil überget_template_partenthaltenAh 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
-
Als akzeptiertmarkiert als das,wasichjetztmache,obwohlich vielleichtmit einer der Strategiengehen kann,die @MarkKaplun unten vorschlägt.Die Verwendung vonget_template_part ()isteine interessante Idee,aberichbin mirnicht sicher,obichein Verzeichnis voller solcher Kurzdateien habenmöchte ...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
-
ooohnein nein,Siemöchtennichtfürjede Kategorieeine Datei,sondernnur die,die den aktuellen Kategorienamenerfasst und verwendet.Sie solltennichtsfest codierenmüssen,stellen Sie sich den Aufwand vor,allesfest zu codierenoooh 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
-
Ich habe den Codein meine child-functions.phpeingefügt,die aktivist.Ich kannjedochnicht auf die Variablein einer PHP-Include-Datei zugreifen,dieich voneinem "normalen" datenbankgenerierten Beitrag aus aufrufe.Bitte raten Siemir,wasmacheichfalsch?(Ich definiereesnatürlich alsglobal.)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
-
Siemüssenjedes Mal,wenn Siees verwenden,"global" deklarieren.Esist keine Verwendung,dieeinmal überallfunktioniert. Siemüssen siejedes Mal verwenden,ohne Ausnahmenjeglicher Art.Aber wieichin meiner Frage sage,sindglobale Variablen schlechte Praxis,problematisch undnicht die Lösung,die Siefür Ihr Problem suchen.Sogar das Böse,das Singletons sind,wäreeine bessere LösungYou 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
-
Vielen Dank,ichfreuemich über Ihren Kommentar.Ich habees deklariert undbenutzt,aberirgendwomussicheinen Fehlergemacht haben.Beimir hateseinfachnichtfunktioniert.Ich habe verschiedene Ansätze ausprobiert.Schließlichfunktionierte [dieser] (https://gist.github.com/aahan/7444046).Ich stimme dem zu,was Sie aufglobaler Ebene sagen,abermanchmalisteine schnelle Lösungfüreine persönliche Websiteerforderlich.Vielen Dank.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
Verwenden Sie keineglobalen Variablen ,soeinfachist das.
Warumnicht Globals
verwenden?Weil die Verwendung von Globals die langfristige Wartung der Softwareerschwert.
- Ein Global kannirgendwoim Code odernirgendwo deklariert werden,dahergibt es keinen Ort,an dem Sieinstinktivnachsehen können,umeinen Kommentar darüber zufinden,wofür der Global verwendet wird
- Beim Lesen von Codegehen Sienormalerweise davon aus,dass Variablenfür die Funktion lokal sind,und verstehennicht,dass sich das Ändernihres Wertsin einer Funktion systemweit ändern kann.
- Wenn sie keine Eingaben verarbeiten,sollten Funktionen denselben Wert/dieselbe Ausgabe zurückgeben,wenn siemit denselben Parametern aufgerufen werden. Die Verwendung von Globalenin einer Funktionführt zusätzliche Parameterein,diein der Funktionsdeklarationnicht dokumentiert sind.
- Globals haben kein spezifisches Initialisierungskonstrukt und daher können Sienie sicher sein,wann Sie auf den Wert des Global zugreifen können,und Sieerhalten keine Fehler,wenn Sie versuchen,vor der Initialisierung auf das Global zuzugreifen.
- Jemand anderes (möglicherweiseein Plugin) verwendetmöglicherweise Globalsmit demselben Namen,wodurch Ihr Code oderje nach Initialisierungsreihenfolge ruiniert wird.
Der WordPress-Kern verwendet viel zu viel Globale. Beim Versuch zu verstehen,wiegrundlegende Funktionen wie
the_content
funktionieren,stellen Sieplötzlichfest,dass die Variable$more
nicht lokal,sondernglobalist und alle Kerndateien durchsuchenmuss,um zu verstehen,wannistes auftruegesetzt.Was kann alsogetan werden,wenn versucht wird,das Kopieren und Einfügenmehrerer Codezeilen zubeenden,anstatt daserste Laufergebnisin einemglobalen Ergebnis zu speichern? Esgibt verschiedene Ansätze,funktionale und OOP.
Die Süßstofffunktion. Esisteinfachein Wrapper/Makro zum Speichern des Kopierens/Einfügens
// input: $id - the category id // returns: the foo2 value of the category function notaglobal($id) { $a = foo1($id); $b = foo2($a); return $b; }
Die Vorteile sind,dassesjetzteine Dokumentation zu den Funktionen desfrüherenglobalen Systemsgibt und Sieeinen offensichtlichen Punktfür das Debuggen haben,wenn der zurückgegebene Wertnicht der von Ihnenerwarteteist.
Sobald Sieeinen Süßstoff haben,können Sie das Ergebnisbei Bedarfeinfach zwischenspeichern (tun Sie diesnur,wenn Siefeststellen,dass die Ausführung dieser Funktion lange dauert)
function notaglobal($id) { static $cache; if (!isset($cache)) { $a = foo1($id); $b = foo2($a); $cache = $b; } return $cache; }
Diesgibt Ihnen dasgleiche Verhalteneinesglobalen Systems,jedochmit dem Vorteil,dass Siebei jedem Zugriffeine sichere Initialisierungerhalten.
Mit OOP können Sie ähnliche Mustererstellen. Ichfinde,dass OOPin Plugins und Themesnormalerweise keinen Mehrwertbringt,aber diesisteine andere Diskussion
class notaglobal { var latestfoo2; __constructor($id) { $a = foo1($id); $this->latestfoo2 = foo2($a) } } $v = new notaglobal($cat_id); echo $v->latestfoo2;
Diesistein umständlicherer Code. Wenn Siejedochmehrere Werte haben,die Sie vorberechnenmöchten,weil sieimmer verwendet werden,kann diesein guter Weg sein. Grundsätzlichist diesein Objekt,das alle Ihre Globals auf organisierte Weiseenthält. Um zu vermeiden,dasseine Instanz dieses Objektsglobal wird (Siemöchtennureine Instanz,andernfallsberechnen Sie die Werteneu),möchten Siemöglicherweiseein Singleton-Muster (einige Leutebehaupten,es seieine schlechte Idee,YMMV)
Ichmöchtenicht direkt aufein Objektattribut zugreifen,daher verzerrtesin meinem Codeetwasmehr
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);
-
Bitte,** schreinicht **.Möchten Sieerklären,warum undeine Art Zitatgeben?Please, **don't shout**. Mind to explain why and provide some kind of citation?
- 7
- 2013-03-04
- brasofilo
-
Ich denke,dass Sie die Antwortfalsch verstanden haben.Wennernicht versucht hätte,frühzeitig zu optimieren,indemer Wertein globalen Variablengespeichert hätte,hätte sein Codefunktioniert.Das Geschreiist,weil das Befolgengrundlegender Prinzipien der Softwareentwicklungetwasist,dasnichtgenugbetont werden kann.Personen,die dieses Grundprinzip (verfügbarbei Ihrem lokalen Google)nicht verstehen,sollten Codenicht über das Internet verbreiten.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
-
Hallo Markus,entschuldige,mein Kommentar war so kurz wie deine Antwort undich solltemich klarermachen: 1) IMO,fett istgenug,umeinen Punkt zumachen.2) Obwohlmanchmalnichtsmehr zu sagenist,vermuteicheine einzeilige Antwort: [Istesin Ordnung,eine einzeilige Antwort zuposten,oder wären diesebesser als Kommentare?] (Http://meta.stackexchange.com/q/129019/185667)Hi, Mark, apologies, my Comment was as short as your Answer and I've should made myself clearer: 1) IMO, bold is enough to make a point. 2) Although sometimes there's nothing more to say, I suspect of one line Answers: [Is it okay to post a one-line answer, or would those be better as comments?](http://meta.stackexchange.com/q/129019/185667)
- 0
- 2013-03-04
- brasofilo
-
yeh,erstnachdemichgepostet habe,wurdemir klar,dassichfett hätte verwenden sollen.wird diesen Aspektbehebenyeh, only after I have posted I realized I should have used bold. will fix that asspect
- 0
- 2013-03-04
- Mark Kaplun
-
IMOist dieseine Antwort. Leute,die von Google hierher kommen,sollten sehen,dasseseine schlechte Ideeist,sofort über die Verwendung von Globalsnachzudenken.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
-
Es reichtnicht aus zu sagen,mach kein X,dumussterklären warum oder du siehst aus,als würdest dues auseiner Laune heraus sagenIt'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 Was würden Sie stattdessentun,um zu vermeiden,dass Sieimmer wieder dasselbe Set-Ding schreibenmüssen und dannjedesmanuell ändernmüssen,wenn sichein Teil davon ändert?@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,die Antwortbearbeitet.@JPollock, edited the answer.
- 0
- 2013-03-05
- Mark Kaplun
-
@ TomJNowell,ichfindees lustig,dassich dereinzige war,der die Frage selbst abgelehnt hat,da sie offensichtlich außerhalb des Bereichs von WASE lag.Ich habenichtgesehen,wie wichtigesist,ein Thema zuerweitern,das hier überhauptnicht hättebeginnen sollen.@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 Super.Ihreerste Lösung klingtnach derbesten.Ich werdemit Cachingexperimentieren,was wahrscheinlichnotwendig sein wird.Ichbin nicht sicher,warum dies außerhalb des Rahmens dieses Stapelaustauschs liegt.Die Fragebezieht sich auf PHP,aberes stellt sich heraus,dasses alles damit zutun hat,wie WordPressmit Globals umgeht.Der Fallist auch spezifischfür WordPress-Navigationsmenüs.@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
-
"WordPress-Kern hat viel zu viel Verwendung von Globals."Ich würde sagen,dass Wordpressmit *irgendwelchen * Globalen viel zu viele hat,aber dasbin nurich."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 dankefür Ihrenfunktionalen Ansatz.Könnten Siefür den Fall,dass wires annehmen,ein Update vornehmen,um uns zu zeigen,wieesmit einem Fallback-Wert von $ ID aussehen sollte,wennes ausirgendeinem Grundnichtexistiert,nichtfestgelegt wurde oder keinepositive Ganzzahl war?@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
-
Globale können aus vielen Gründen oft schlecht sein,aber auch Menschen,die sagen,dass sieniemals Globale verwenden.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
Ihre Fragebezieht sich auf die Funktionsweise von PHP.
Nehmen Sie $ wpdb als Beispiel
$ wpdb isteine bekannteglobale Variable.
Wissen Sie,wannes deklariert undmit Werten versehen wird?
Jedegeladene Seite ,ja,jedes Mal,wenn Sie Ihre WordPress-Sitebesuchen.
Ebensomüssen Sie sicherstellen,dass die Variablen,dieglobalisiert werden sollen,aufjedergeladenen Seite deklariert undmit entsprechenden Werten versehen werden.
Obwohlich kein Theme-Designerbin,kannichfeststellen,dass das after_setup_themeein einmaliger Hookist.Es wirdnur ausgelöst,wenn das Thema aktiviertist.
Wennich du wäre,würdeichinit oder andere Hooks verwenden.Nein,wennich Sie wäre,würdeich überhaupt keineglobalen Variablen verwenden ...
Ich kann wirklichnichtgut Dingeerklären.Sie sollten alsoein Buchin die Handnehmen,wenn Sie sichmit PHPbeschäftigenmöchten.
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
Sie könnenjederzeitein Singleton-Muster über statische Getter verwenden.
<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: Meine ursprüngliche Frage wurdegelöst,aber dies wird zueinergültigen Diskussion darüber,warum keineglobalen Variablen verwendet werden sollen. Daher aktualisiereich die Frage,um dies widerzuspiegeln. Die Lösung war
<?php global $category_link_prop; echo esc_url( $category_link_prop ); ?>
wie von @TomJNowell vorgeschlagen.UPDATE 2: Ich habejetztgenau dasgetan,wasich wollte. Aberichbenutzeimmernoch denglobalen Geltungsbereich und würdegerneeinen besseren Wegfinden.
Ich versuche,eine ganze Reiheglobaler Variablenfür die Permalinks zu Kategorieneinzurichten,die an verschiedenen Stellenin meinem Thema verwendet werden sollen. Der Hauptgrund dafürist die Verwendung sowohlin der Hauptnavigation als auchin einer Reihe von Unternavigationen,diebasierend auf der Kategorie ausgewählt werden,in der sich der aktuelle Beitragbefindet. Diesist kein Thema,dasichbehandeln werdefür die Verwendung durch anderefreigegeben werden,wurdejedochfüreinen ganzbestimmten Zweckentwickelt.
Soerstelleich sie derzeit (ich habenureinige der Variableneingefügt).
Ich kannjetzt
<?php global $prop; echo $prop; ?>
an den 4 Stellen,an denen dergesamte Linkfür den Code zurückgegeben wird. Wenn sich das ändert,mussichesnur aneiner Stelle ändern. Ichbin offenfür Alternativen,dienicht denglobalen Geltungsbereichbetreffen.