Как установить и использовать глобальные переменные? Или почему бы их вообще не использовать
-
-
Какая ссылка делает этот операторechoesc_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 () не дает мне всего,что мне нужно (например,ссылку,заголовок и т. Д.).Меня не беспокоит читабельность,я буду единственным,кто это читал.@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
-
создайте функцию,которая выводит ваше меню на основе контекста,который вы ей передаете,таким образом вы можете сохранить всю логику меню и связанные переменные в одном месте.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 Я начал с этого,но знаю,что у меня есть одна функция для навигации по верхней панели;одна функция для боковой панели навигации,которая только что выросла до 4 различных версий на основе условных выражений;и одна функция для вспомогательной навигации в шаблоне страницы,и их будет больше,когда это будет продолжаться.Я не могу придумать разумного способа объединить все это в одну функцию.@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,каждый запрос загружает новую копию приложения,которая затем умирает,когда запрос завершен. По этой причине глобальные переменные,установленные в одном запросе,не сохраняются до следующего запроса
Замечание 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.
-
Я знаю,что использовать глобальную область видимости немного безумно,но большинство,если не все эти переменные будут использоваться на каждой странице.Я открыт для лучших идей.Я собираюсь отредактировать вопрос,чтобы прояснить мои намерения.Кстати,он отлично работает,когда я делаю ` Phpglobal $ category_link_prop;echoesc_url ($ category_link_prop);?> `согласно вашему предложению.Благодаря!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_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
-
Отмечено как принятое,поскольку это то,что я делаю сейчас,хотя я могу пойти с одной из стратегий,которые @MarkKaplun предлагает ниже.Использованиеget_template_part () - интересная идея,но я не уверен,что хочу иметь каталог,полный таких коротких файлов ...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 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
-
Я помещаю код в активный дочерний файл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.Итак,что можно сделать,пытаясь остановить копирование и вставку нескольких строк кода вместо сохранения результата первого запуска в глобальном? Есть несколько подходов,функциональный и ООП.
Функция подсластителя. Это просто оболочка/макрос для сохранения копии/вставки
// 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; }
Это дает вам то же поведение,что и глобальное,но с преимуществом гарантированной инициализации при каждом доступе к нему.
Подобные шаблоны могут быть и с ООП. Я считаю,что ООП обычно не добавляет ценности плагинам и темам,но это другое обсуждение
class notaglobal { var latestfoo2; __constructor($id) { $a = foo1($id); $this->latestfoo2 = foo2($a) } } $v = new notaglobal($cat_id); echo $v->latestfoo2;
Это более неуклюжий код,но если у вас есть несколько значений,которые вы хотели бы предварительно вычислить,потому что они всегда используются,это может быть подходящим вариантом. По сути,это объект,который содержит все ваши глобальные объекты организованным образом. Чтобы не делать экземпляр этого объекта глобальным (вам нужен только один экземпляр,иначе вы повторно вычисляете значения),вы можете использовать одноэлементный шаблон (некоторые люди утверждают,что это плохая идея,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
-
Я думаю,что вы неправильно поняли ответ.Если бы он не пытался провести раннюю оптимизацию,сохраняя значения в глобальных переменных,его код работал бы.Это вызвано тем,что следование основным установленным принципам разработки программного обеспечения - это то,что нельзя переоценить.Людям,которые не понимают этих основных принципов (их можно найти в вашем местном Google),не следует распространять код по сети.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) ИМО,жирного шрифта достаточно,чтобы выразить точку зрения.2) Хотя иногда больше нечего сказать,я подозреваю,что ответы в одну строку: [Можно ли публиковать однострочные ответы или лучше в комментариях?] (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
-
ИМО,это ответ,люди,которые приходят сюда из Google,должны видеть,что даже думать об использовании глобальных объектов сразу - плохая идея.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 Потрясающе.Ваше первое решение кажется лучшим.Поэкспериментирую с кешированием,которое наверняка понадобится.Я не уверен,почему это выходит за рамки этого stackexchange?Вопрос касается 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 - это одноразовая ловушка.он сработает только при активации темы.
На вашем месте я бы использовал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: теперь он делает именно то,что я хотел. Но я все еще использую глобальную область видимости и буду рад найти лучший способ.
Я пытаюсь настроить множество глобальных переменных для постоянных ссылок на категории,которые будут использоваться в различных местах моей темы. Основная причина этого заключается в использовании как в основной навигации,так и в серии под-навигации,которые выбираются в зависимости от категории,в которой находится текущая публикация. Это не та тема,которую я буду выпускается для использования другими,но создан для одной очень конкретной цели.
Вот как я их сейчас создаю (я вставил только несколько переменных).
Теперь я могу выполнять
<?php global $prop; echo $prop; ?>
int он 4 места,который идет и возвращает всю ссылку для кода. Когда это изменится,мне нужно будет изменить его только в одном месте. Я открыт для альтернатив,которые не затрагивают глобальный охват.