グローバル変数を設定して使用する方法は?または、それらをまったく使用しないのはなぜですか
-
-
このステートメントはどのリンクをエコーしますかesc_url($ category_link_prop);表示しますか?あなたの期待されるリンクは何ですか?Which link does this statement echo esc_url( $category_link_prop ); displays ? What is your expected link?
- 1
- 2013-03-04
- Vinod Dalvi
-
グローバル変数を使用する予定の場所で、「get_cat_ID(****)」を使用しないのはなぜですか.私はあなたがそれをする方法で速度の利点があるだろうとは思わない.読みやすさの観点から、 'get_cat_ID(****)'が勝ちます.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
-
言い換えてもらえますか?私はあなたの質問を読みましたが、あなたが何をしたいのか、なぜあなたがそれをしたいのかまだわかりません.私の一般的なアドバイスは、グローバル変数を使用せず、グローバルスコープを汚染しないことです.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私はスラッグ提案でカテゴリーへのリンクを取得したいと思っていました.@VinodDalvi I was hoping to get the link to the category with the slug proposal'.
- 0
- 2013-03-05
- JPollock
-
@TomJNowellナビゲーションにこれを使用していることを反映するために、すぐに編集します.いずれにせよ、ほとんどすべてのページで使用されます.@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()は、私が必要とするすべて(つまり、リンク、タイトルなど)を5つにまとめているわけではありません.読みやすさは私にとって大きな関心事ではありません.これを読んでいるのは私だけです.@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
-
これは[X/Y問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)のように聞こえます.おそらく、バックアップして、希望する結果が何であるかを正確に説明する必要があります.一連のグローバル変数を設定して、他の場所のナビゲーションでそれらへの参照をハードコードするよりもはるかに洗練されたソリューションがあると確信していますthis 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すばらしい点.私の実際の問題は、私のテーマに4つの異なるナビゲーションがあることです(これまでのところ).1つは標準のトップバーで、3つは特定の条件に基づいてのみ表示されます.それらはすべて、ほぼ同じものの異なる組み合わせを示し、任意の順序であり、プロジェクトが進むにつれて変化します.私の問題は、それらをハードコーディングすると、同じものを何度もハードコーディングし、何かが変わるたびに同じものを4回変更する必要があるということです.@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
-
渡したコンテキストに基づいてメニューを出力する関数を作成します.これにより、すべてのメニューロジックと関連する変数を1か所にカプセル化しておくことができます.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それは私が始めたものですが、トップバーナビゲーション用の関数が1つあることを知っています.条件に基づいて4つの異なるバージョンに成長したばかりのサイドバーナビゲーション用の1つの関数.ページテンプレートのサブナビゲーション用の1つの関数であり、これが進むにつれてさらに多くの関数が存在するようになります.これらすべてを1つの機能に組み合わせる正しい方法を思いつくことはできません.@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また、投稿(機能する場合)またはページテンプレートのいずれかで、サイトのテキスト内のサイトのさまざまな部分へのリンクとしてこれらを使用できるようにしたいと思います.@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 回答
- 投票
-
- 2013-03-04
これには強くお勧めしますが、スピードアップはしませんが、使い方は正しくありません.
WordPressはすでにこれらのものをオブジェクトキャッシュにキャッシュしています.結果を保存して再利用する必要はありません.WPはすでにそれを行っています.
このマイクロ最適化の結果として、コードの実行速度が遅くなる可能性が非常に高く、速くはありません!
グローバルの使用方法
グローバルを使用する場合は、最初に
global
キーワードを指定する必要があります.値を定義するときにここで指定しましたが、そのスコープ外では、グローバルスコープ変数として再宣言する必要があります.例:
functions.php
内:function test() { global $hello; $hello = 'hello world'; } add_action( 'after_setup_theme', 'test' );
single.php
では、これは機能しません:echo $hello;
$hello
が定義されていないため.ただし、これは機能します:global $hello; echo $hello;
もちろん、どちらも行うべきではありません. WordPressはすでにこれらのものをオブジェクトキャッシュにキャッシュしようとしています.
グローバル変数のデメリットと危険性
これを行っても速度は向上しません(速度がわずかに低下する場合があります).複雑さが増し、不要なグローバル宣言を多数入力する必要があります.
他の問題も発生します:
- テストを書くことが不可能なコード
- 実行するたびに異なる動作をするコード
- 共有名前空間からの変数名の衝突
-
global
の宣言を忘れた場合の偶発的なバグ
- コードデータストレージの構造が完全に欠如している
- その他多数
代わりに何を使用する必要がありますか?
オブジェクトや依存性注入などの構造化データ、または場合によっては関数のセットを使用することをお勧めします.
静的変数
静的変数は良くありませんが、グローバル変数のやや邪悪ないとこと考えてください.静的変数はグローバル変数に対するものであり、泥で覆われたパンはシアン化物に対するものです.
たとえば、静的変数を介して同様のことを行う方法は次のとおりです.
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
シングルトン
シングルトンは静的変数に似ていますが、クラスにそのクラスのインスタンスを持つ静的変数が含まれている点が異なります.構文が異なるだけで、グローバル変数と同じくらい悪いです.それらを避けてください.
WP_Cache、実行しようとしたがWPはすでに実行していること
再利用するデータをどこかに保存して時間を節約したい場合は、
WP_Cache
などでwp_cache_get
システムを使用することを検討してください.$value = wp_cache_get( 'hello' ); if ( false === $value ) { // not found, set the default value wp_cache_set( 'hello', 'world' ); }
これで、値はWordPressによるリクエストの存続期間中キャッシュされ、デバッグツールに表示されます.オブジェクトキャッシュがある場合は、リクエスト間で保持されます
補足1:PHPがどのように機能するかを知らずに、リクエスト間でグローバル変数にデータを保持しようとする人がいることに注意してください. Nodeアプリケーションとは異なり、各リクエストはアプリケーションの新しいコピーをロードし、リクエストが完了すると終了します.このため、1つのリクエストに設定されたグローバル変数は、次のリクエストまで存続しません
補足2:更新された質問から判断すると、グローバル変数ではパフォーマンスがまったく向上しません. HTMLは、必要なときに必要なときに生成するだけで、同じくらい速く、おそらく少しでも速く実行されます.これはマイクロ最適化です.
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.
-
グローバルスコープを使用するのは少し難しいことは知っていますが、これらの変数のすべてではないにしても、ほとんどがすべてのページで使用されます.私はより良いアイデアを受け入れています.質問を編集して、意図を少し明確にします.ところで、 ` `あなたの提案に従って.ありがとう!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
-
ああ、私の解決策が機能する場合、承認済みとしてマークできますか?グローバル変数は元の呼び出しを行うのと同じくらい高速です.代わりに関数を使用してみてください.そうすれば、2行を入力する必要がなくなります.さらに、シングルトン、さらには、すべてを動的に、get_template_partを介して含まれるテンプレートパーツAh 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
-
@MarkKaplunが以下に提案している戦略のいずれかを使用する可能性がありますが、現在行っていることとして受け入れられたとマークされています.get_template_part()を使用することは興味深いアイデアですが、そのような短いファイルでいっぱいのdirが必要かどうかはわかりません...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いいえ、各カテゴリのファイルは必要ありません.現在のカテゴリ名を取得してそれを使用するファイルだけが必要です.何もハードコーディングする必要はありません.すべてをハードコーディングする煩わしさを想像してみてください.oooh 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
-
アクティブなchild-functions.phpにコードを入れました.しかし、「通常の」データベースで生成された投稿から呼び出すphp-includeファイルの変数にアクセスできません.教えてください、私は何を間違えますか?(もちろん、グローバルと定義します.)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
-
使用するたびに `global`を宣言する必要があります.それは一度はどこでも機能する使用法ではありません、あなたはそれを毎回使用しなければなりません、そして毎回、どんな種類の例外もありません.しかし、私の質問で言っているように、グローバル変数は悪い習慣であり、問題があり、問題に対して探している解決策ではありません.シングルトンである悪でさえ、より良い解決策になるでしょうYou 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
-
ありがとう、コメントありがとうございます.私はそれを宣言して使用しましたが、どこかで間違いを犯したに違いありません.それは私にはうまくいきませんでした.私はさまざまなアプローチを試しました.ついに[これ](https://gist.github.com/aahan/7444046)が機能しました.私はあなたがグローバルで言うことに同意します、しかし時々個人的なサイトのために迅速な修正が必要です.ありがとう.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
グローバル変数を使用しないでください.そのように単純です.
グローバルを使用しない理由
グローバルを使用すると、ソフトウェアを長期間維持することが難しくなるためです.
- グローバルはコード内のどこでも宣言できますが、どこにも宣言できません.そのため、グローバルが何に使用されているかについてのコメントを本能的に見ることができる場所はありません.
- コードを読んでいる間、通常、変数は関数に対してローカルであると想定し、関数内で変数の値を変更するとシステム全体が変更される可能性があることを理解していません.
- 入力を処理しない場合、関数は同じパラメーターで呼び出されたときに同じ値/出力を返す必要があります.関数でグローバルを使用すると、関数宣言に記載されていない追加のパラメーターが導入されます.
- グローバルには特定の初期化構造がないため、グローバルの値にいつアクセスできるかがわかりません.また、初期化前にグローバルにアクセスしようとしてもエラーは発生しません.
- 他の誰か(プラグインかもしれません)が同じ名前のグローバルを使用してコードを台無しにしたり、初期化の順序に応じてコードを台無しにしたりする可能性があります.
WordPressコアは、グローバルを多用する方法がたくさんあります.
the_content
のような基本的な関数がどのように機能するかを理解しようとすると、$more
変数がローカルではなくグローバルであり、コアファイル全体を検索していつ理解する必要があるかに突然気付きます.trueに設定されていますか.では、最初の実行結果をグローバルに保存する代わりに、コードのコピーと貼り付けを停止しようとするとどうなるでしょうか.関数型とOOPのいくつかのアプローチがあります.
甘味料機能.コピー/貼り付けを保存するための単なるラッパー/マクロです
// input: $id - the category id // returns: the foo2 value of the category function notaglobal($id) { $a = foo1($id); $b = foo2($a); return $b; }
利点は、以前のグローバルが何をするかについてのドキュメントがあり、返される値が期待したものではない場合にデバッグするための明確なポイントがあることです.
甘味料を入手したら、必要に応じて結果を簡単にキャッシュできます(この関数の実行に時間がかかることがわかった場合にのみキャッシュしてください)
function notaglobal($id) { static $cache; if (!isset($cache)) { $a = foo1($id); $b = foo2($a); $cache = $b; } return $cache; }
これにより、グローバルと同じ動作が得られますが、アクセスするたびに確実に初期化できるという利点があります.
OOPでも同様のパターンを持つことができます. OOPは通常、プラグインやテーマに何の価値ももたらさないことがわかりましたが、これは別の議論です
class notaglobal { var latestfoo2; __constructor($id) { $a = foo1($id); $this->latestfoo2 = foo2($a) } } $v = new notaglobal($cat_id); echo $v->latestfoo2;
これは不器用なコードですが、常に使用されているために事前計算したい値がいくつかある場合は、これが最適な方法です.基本的に、これはすべてのグローバルを整理された方法で含むオブジェクトです.このオブジェクトのインスタンスがグローバルになるのを避けるために(1つのインスタンスが必要です.そうでない場合は値を再計算します)、シングルトンパターン(YMMV、悪い考えだと主張する人もいます)
オブジェクト属性に直接アクセスするのは好きではないので、私のコードではさらにワープします
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);
-
**叫ばないでください**.理由を説明し、ある種の引用を提供することを心がけていますか?Please, **don't shout**. Mind to explain why and provide some kind of citation?
- 7
- 2013-03-04
- brasofilo
-
あなたは答えを誤解したと思います.彼がグローバル変数に値を格納することによって初期の最適化を行おうとしなかった場合、彼のコードは機能したでしょう.叫び声は、確立された基本的なソフトウェア開発の原則に従うことは、十分に強調することができないものだからです.これらの基本原則(ローカルのグーグルで入手可能)を理解していない人は、コードをネット上に広めるべきではありません.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
-
こんにちは、マーク、お詫びします.私のコメントはあなたの回答と同じくらい短かったので、もっと明確にすべきでした.1)IMO、太字で十分です.2)何も言うことがない場合もありますが、1行の回答が疑われます:[1行の回答を投稿しても大丈夫ですか、それともコメントとして投稿したほうがいいですか?](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, only after I have posted I realized I should have used bold. will fix that asspect
- 0
- 2013-03-04
- Mark Kaplun
-
IMOこれは答えです.グーグルからここに来る人々は、すぐにグローバルを使用することを考えることさえ悪い考えであることを理解する必要があります.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
-
Xをしないと言うだけでは十分ではありません.理由を説明する必要があります.そうしないと、気まぐれで言っているように見えます.It'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代わりに、同じセットのものを何度も何度も書く必要がなく、その一部が変更された場合にそれぞれを手動で変更する必要がないようにするにはどうしますか?@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、答えを編集しました.@JPollock, edited the answer.
- 0
- 2013-03-05
- Mark Kaplun
-
@TomJNowell、明らかにWASEの範囲外だったので、質問自体に反対票を投じたのは私だけだったのはおかしいと思います.ここで始めるべきではなかったテーマを拡大することの価値はまったくわかりませんでした.@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素晴らしい.あなたの最初の解決策は最高のように聞こえます.おそらく必要になるキャッシングを試してみます.これがこのスタック交換の範囲外である理由がわかりませんか?質問はPHPについてですが、WordPressがグローバルをどのように扱うかに関係していることがわかりました.また、このケースは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
-
「WordPressコアは、グローバルを多用する方法がたくさんあります.」Wordpressが*任意の*グローバルを持っているのは多すぎると思いますが、それは私だけです."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はあなたの機能的なアプローチに感謝します.私たちがそれを受け取った場合、何らかの理由でそれが存在しなかった、設定されなかった、または正の整数ではなかった場合、$ IDのフォールバック値でどのように見えるかを示すために更新を行うことができますか?@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
-
グローバルは多くの理由で悪いことがよくありますが、グローバルを決して使用しないと言う人々もそうです.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
あなたの質問は、phpがどのように機能するかに関係しています.
例として $ wpdb を取り上げます
$ wpdb はよく知られているグローバル変数です.
いつ宣言され、値が割り当てられるか知っていますか?
すべてのページが読み込まれます、そうです、WordPressサイトにアクセスするたびに.
同様に、グローバル化する変数が宣言され、ページが読み込まれるたびに対応する値が割り当てられるようにする必要があります.
私はテーマデザイナーではありませんが、after_setup_themeは1回限りのフックであることがわかります.テーマがアクティブ化されたときにのみトリガーされます.
私があなたなら、initまたは他のフックを使用します.いいえ、私があなたなら、グローバル変数はまったく使用しません...
私は物事を説明するのが本当に苦手です.したがって、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
静的ゲッターを介していつでもシングルトンパターンを使用できます.
<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
更新:元の質問は解決されましたが、これはグローバル変数を使用しない理由についての有効な議論になりつつあるため、それを反映するように質問を更新しています.解決策は
<?php global $category_link_prop; echo esc_url( $category_link_prop ); ?>
@TomJNowellが提案したように.更新2:これで私が望んでいたことを正確に実行できるようになりました.しかし、私はまだグローバルスコープを使用しており、より良い方法を見つけたいと思っています.
テーマのさまざまな場所で使用されるカテゴリへのパーマリンク用に、多数のグローバル変数を設定しようとしています. これの主な理由は、メインナビゲーションと、現在の投稿がどのカテゴリにあるかに基づいて選択される一連のサブナビゲーションの両方で使用するためです.これは私が行うテーマではありません他の人が使用するためにリリースされますが、1つの非常に特定の目的のために構築されています.
これは私が現在それらを作成している方法です(私はいくつかの変数にのみ貼り付けました).
これで
<?php global $prop; echo $prop; ?>
4つの場所に移動し、コードのリンク全体を取得します.それが変わるとき、私はそれを一箇所で変える必要があるだけです.私は、グローバルスコープを含まない代替案を受け入れています.