전역 변수를 설정하고 사용하는 방법은 무엇입니까? 아니면 전혀 사용하지 않는 이유
-
-
이 문은 어떤 링크를 수행합니까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 훌륭한 포인트.내 실제 문제는 내 테마에 (지금까지) 네 가지 탐색이 있다는 것입니다. 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의 요청 기간 동안 캐시되고 디버깅 도구에 표시되며 개체 캐시가있는 경우 요청간에 유지됩니다.
<시간>Sidenote 1 : 어떤 사람들은 이것이 PHP가 작동하는 방식이 아니라는 것을 모르고 요청에 걸쳐 전역 변수에 데이터를 유지하려고합니다. 노드 애플리케이션과 달리 각 요청은 애플리케이션의 새 사본을로드 한 다음 요청이 완료되면 종료됩니다. 이러한 이유로 하나의 요청에 설정된 전역 변수는 다음 요청까지 유지되지 않습니다.
Sidenote 2 : 업데이트 된 질문으로 판단 할 때 글로벌 변수는 성능 향상을 전혀 제공하지 않습니다. 필요할 때 HTML을 생성하면됩니다. 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.
-
전역 스코프를 사용하는 것이 약간 어리 석다는 것을 알고 있지만,이러한 변수가 모든 페이지에서 사용되는 것은 아니지만 대부분이 사용됩니다.나는 더 나은 아이디어에 열려 있습니다.내 의도를 좀 더 명확하게 만들기 위해 질문을 편집하겠습니다.BTW 그것은 내가 할 때 완벽하게 잘 작동합니다``귀하의 제안에 따라.감사!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
-
아 내 솔루션이 작동하면 수락 됨으로 표시 할 수 있습니까?전역 변수는 원래 호출을 만드는 것만 큼 빠릅니다. 대신 함수를 사용하여 두 줄을 입력 할 필요가 없습니다. 단일 항목을 입력 할 필요가 없습니다.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 ()를 사용하는 것은 흥미로운 아이디어이지만,이와 같은 짧은 파일로 가득 찬 디렉토리를 갖고 싶은지 모르겠습니다.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
-
감사합니다. 귀하의 의견에 감사드립니다.나는 그것을 선언하고 사용했지만 어딘가에서 실수를 했음에 틀림 없다.그것은 나를 위해 작동하지 않았습니다.나는 다른 접근 방식을 시도했습니다.마침내 [this one] (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;
이것은 서투른 코드이지만 항상 사용되기 때문에 미리 계산하고 싶은 값이 여러 개인 경우이 방법을 사용할 수 있습니다. 기본적으로 이것은 조직화 된 방식으로 모든 전역을 포함하는 객체입니다. 이 객체의 인스턴스를 전역으로 만들지 않으려면 (하나의 인스턴스를 원하고 그렇지 않으면 값을 다시 계산합니다) 싱글 톤 패턴 (일부 사람들은 이것이 나쁜 생각이라고 주장합니다. 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) IMO,굵게 표시하는 것만으로도 충분합니다.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
-
IMO 이것은 대답입니다. 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
-
dont do 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 는 잘 알려진 전역 변수입니다.
언제 선언되고 값이 할당되는지 아십니까?
로드되는 모든 페이지 ,그렇습니다. 워드 프레스 사이트를 방문 할 때마다
마찬가지로,글로벌화하려는 변수가 모든 페이지가로드 될 때마다 해당 값으로 선언되고 할당되는지 확인해야합니다.
내가 테마 디자이너는 아니지만 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; ?>
4 곳에서 코드에 대한 전체 링크를 가져옵니다. 변경되면 한 곳에서만 변경하면됩니다. 저는 글로벌 범위를 포함하지 않는 대안에 개방적입니다.