2014-09-17 2 views
4

나는 내 사이트에서 액세스 할 수 있어야하는 일련의 변수가 있습니다. header.php 파일에서 선언 할 수는 있지만, functions.php에서 정의하거나 템플릿 파일 (view)에서 정의하는 것을 선호합니다. 내가 읽은 모든 것은 세계적인 것을 사용하지 않는다고 말한다. ... 괜찮아. 그렇다면 이러한 변수를 정의하는 가장 좋은 방법은 무엇입니까? 여기 지구본에 대한 대안

내가 정의하기 위해 찾고 있어요 무엇 :

global $favorites_array; 
global $user; 
global $user_id; 
global $user_name; 
global $uri; 

$user = wp_get_current_user(); 
$user_name = $user->user_login; 
$user_id = $user->ID; 
$user_id = get_current_user_id(); 
$uri = $_SERVER['REQUEST_URI']; 
+2

... 즉, 이들에 대한 변수를 귀찮게 그냥 직접 소스를 사용하지 않습니다. 사용자가 필요하면'wp_get_current_user()'를 호출하십시오. 'wp_get_current_user() -> user_login'으로 연결하여 직접 사용자 이름을 검색 할 수도 있습니다. –

+1

필자가 생각한 원래의 추론은 wp_get_current_user()를 한 번만 호출하기를 원했을 것이라고 생각했습니다. $ user-> wp_get_current_user()를 호출 한 다음 $ user-> XXXX를 호출하면 사용자에 대한 정보가 필요할 때마다 약간의 것 같습니다. – ok1ha

+0

그게 좋겠어, 고마워! – ok1ha

답변

4

당신이 전역을 사용하여 (또는 가능하면 그들을 피할 수)에 대해 찾은 일반적인 조언은 일반적으로 좋은 충고, 당신은 먼저 보는 것이 정확 대안을 사용하는 것보다. 가장 일반적인 대안은 함수에 값을 매개 변수로 전달하는 것입니다.

WordPress의 많은 기능은 이미 전역 변수에 의존하고 있으며 looking into the source codewp_get_current_user()이라는 함수가 실제로는 $current_user이라는 전역 변수를 설정하고있는 것으로 보입니다. wp_get_current_user()will immediately return if the global $current_user is already populated:

if (isset($current_user) && ($current_user instanceof WP_User) && ($id == $current_user->ID)) 
    return $current_user; 

여러 통화 그래서 당신은 설정하도록 구성 변수의리스트를보고, 나는 그들 중 하나에 모든 컨테이너 변수에 대한 강력한 필요성을 볼 수 없습니다. 가능한 한 코드에서 명백한 가독성을 선택하는 것이 좋습니다. WordPress가 global $user을 생성하고 그 주위를 지나가는 대신 해당 사용자를 얻는 것이 목적 인 wp_get_current_user() 기능을 제공하므로 으로 전화하십시오.

// Can't do this: 
echo "The user is {wp_get_current_user()->user_login}"; 

... 그래서 당신이 그렇지 않으면 사용자의 로그인에 대한 전역 변수를 만들 의도는 경우에, 로컬 설정 : 그것은 당신이, 예를 들어, 문자열 보간 내부의 함수 호출을 사용할 수 없다는 사실 당신의 기능 중 하나에. ID 때문에, 사용자 오브젝트의 ID 속성 컨테이너 역할 $user_id 같은 변수를 설정로서는

function your_func() { 
    $login = wp_get_current_user()->user_login; 
    echo "The user is $login"; 
} 

실제로 사용자 객체의 속성, 그것의 그 관계를 유지하는 것이 좋다 논리 합리적하여 암호. 이 빠를 수 있지만 입력합니다 :

echo $user_id; 

이 변수의 명시적인 소스 만드는 다음 $_SERVER 배열과 관련하여,

echo wp_get_current_user()->ID; 
// or even better, using the API function 
echo wp_get_current_user_id(); 

마지막을 이미 a PHP superglobal array이다, 사용할 수를 의 모든 범위 여분의 노력이 필요없이. 그래서 그 대신의 형태로 그것에서 하나의 키를 추상화의 :

$uri = $_SERVER['REQUEST_URI']; 

난 그냥 자신의 기능에 직접 $_SERVER['REQUEST_URI']를 사용합니다 을 선택할 것입니다.당신은 자동 전역 값을 사용하는 경우, 당신을 다시

function uses_uri() { 
    $uri = $_SERVER['REQUEST_URI']; 
    echo "I like to say $uri over and over $uri $uri $uri"; 
} 

그러나 : 당신은 당신이 하나의 함수에 여러 번 사용할 필요가 찾을 경우, 예를 들어, 다음 기능에 지역 변수를 만들어 주시기 코드가 직접 사용되거나 로컬 변수가 사용되는 곳 근처에 정의되어 있으면 (더 쉽게 이해할 수 있도록 값을 추적해야하는 별도의 포함 파일에 정의 된 전역 변수와 달리) 코드가 더 읽기 쉽습니다.

WordPress의 API에 익숙하지 않기 때문에 요청 URI를 검색 할 수있는 API 함수가 제공된다고 말할 수 없습니다. 그러나 그러한 기능이 이미 존재하고 WP 코드에서 통상적으로 사용된다면 나는 놀라지 않을 것이다.

+0

다시 한번 감사드립니다. – ok1ha

+0

@ ok1ha 행운을 빈다. –

2

맞아요, 당신은 전역을 사용해서는 안됩니다. 한 가지 방법은 테마 코드를 클래스에 넣고 인스턴스화하는 것입니다.

아래 예제는 테마 템플릿 파일에 필요한 변수가있는 싱글 톤 스타일 클래스 정의를 사용하며 사용자가하려는 일을 성취했다고 생각합니다.

functions.php :

class My_Theme { 
    public $favorites_array; 
    public $user; 
    public $user_id; 
    public $user_name; 
    public $uri; 

    protected function __construct(){ 
     // TODO: put all your add_filter and add_action calls here 

     $this->favorites_array = array(); 
     $this->user = wp_get_current_user(); 
     $this->user_name = $this->user->user_login; 
     $this->user_id = get_current_user_id(); 
     $this->uri = $_SERVER['REQUEST_URI']; 
    } 

    function get_instance() { 
     static $instance; 
     if(! isset($instance)) 
      $instance = new self(); 

     return $instance; 
    } 
} 

My_Theme::get_instance(); 

다음 header.php에서 당신이 할 수는 :

<?php 
    $my_theme = My_Theme::get_instance(); 
?> 
<html> 
    ... 
    ... 
    <title>Hello <?php echo(esc_html($my_theme->user_name)); ?></title> 

또한 지적해야 그 변수의 모습으로 당신이, 당신이 아마 단지 $favorites_array이 필요합니다. 그 이유는 다른 것들은 모두 WordPress 기능을 사용하여 검색 할 수 있기 때문입니다.

1

글쎄, "글로벌을 사용하지 마라"라는 블로그가 많지만 그 이유를 설명하지 않고 사실입니다. 모든 언어에는 "글로벌"이 있습니다. 그리고 그것은 문제가 아닌 것 같습니다. 우리가 찾을 수있는 유일한 "문제"는 큰 코드에서 다른 파일 (대다수의 C 개발자는 100 개 이상의 파일을 가질 수 있음)에서 문제가되는 wuth global을 찾기가 어려울 수 있다는 것입니다. . PHP에서 코드는 종종 짧습니다.

실제로 고려해야 할 사항은 var가 전역 변수인지 여부를 신속하게 감지 할 수 있도록 명명 규칙을 사용하는 것입니다. 예를 들어 "gl"또는 "glb"로 쳐다 보며 이름을 지정하십시오. 이렇게하면 함수의 시작 부분에 "global"을 넣는 것을 잊지 않아도됩니다. 세션, fucntion 매개 변수 전역 등을 사용하십시오. 각각은 긍정적이고 부정적인 포인트입니다. 그 중 하나를 사용하지 않아도됩니다.

값이 코드 전체에 동일하게 유지되면 상수 (DEFINE)를 사용하는 것이 다른 좋은 옵션이 될 수 있습니다.

감사 피터