2012-06-23 6 views
2

global 키워드를 사용하지 않고 PHP에서 Java stlye 방식으로 전역 변수를 사용하는 다른 방법이 있습니까?PHP 글로벌 키워드 해결 방법

아래 예는 매우 일반적이며 간단합니다. 나는 define 키워드로 그것을 할 것입니다, 그러나 당신이 볼 수 있듯이, varibales는 서로 의존적이며, 나는 당신이 define으로 그것을 달성 할 수 없다고 믿습니다.

아래 예에서 나는 물론 오류가 발생합니다.

정말 해결책이 찾고 있습니다. 그냥 전역 변수를 사용하고자하는 funciton에 대해 global 정의를 작성해야하는 것이 좋을 것 같은 비효율적 인 솔루션처럼 보입니다. 아래 Kolink의 의견을 참조 - 다음과 같이

$BASE_URL = "mysite.com"; 
$PRODUCTS_URL = $BASE_URL . "/products"; 
$ABOUT_URL = $BASE_URL . "/about"; 

function foo() { 
    echo $BASE_URL; 
} 

답변

1

내가 볼 수 있듯이 varibales는 서로 종속되어 있으므로 정의 할 수 없다고 생각합니다.

사실이 아니, 이것은 잘 작동합니다 - 그것은 아마이 접근하는 것이 방법 : 대신 함수를 작성 할 수 있습니다

define('BASE_URL', "mysite.com"); 
define('PRODUCTS_URL', BASE_URL . "/products"); 
define('ABOUT_URL', BASE_URL . "/about"); 

그냥 일정한 공간을 식사에주의를 이 같은 아마 뭔가 (미세 조정, 그냥 예를 사용할 수는) :

function get_url($item = NULL, $include_base = TRUE) 
{ 
    $urls = array(
     'base' => 'mysite.com', 
     'products' => '/products', 
     'about' => '/about', 
    ); 
    $output = $include_base ? $urls['base'] : ''; 
    if (isset($urls[$item])) $output .= $urls[$item]; 
    return $output; 
} 

다음 echo get_url('products');과 같이 호출. foo()이 호출 될 때 이것이 정의되어있는 한 작동 할 것입니다. 나는 항상 global 또는 $GLOBALS을 피하기 위해 노력할 것입니다.

1

당신은

function foo() { 
    echo $GLOBALS['BASE_URL']; 
} 

그러나 ... 자동 전역 $ GLOBALS를 사용할 수 있습니다. PHP 5.4.0에서 $ GLOBALS 수퍼 글로벌은 처음 사용할 때만 초기화되므로 사용하지 않고 global 키워드를 사용하는 것이 성능상의 이점이 있습니다.

당신이하고있는 일에 대해, 하나의 전역 배열을 정의 할 수 있습니다.

$CONF['BASE_URL']='foo'; 

그런 다음 당신은, 아직, 또는 더 나은가 필요한 모든 기능에 global $CONF를 사용하는 구성 클래스의 어떤 종류로 포장해야합니다.

+1

'$ GLOBALS' 배열은 PHP 5.4에서 적시에 추가됩니다. 이 경우'global $ myvar'를 지정하지 않도록 호출하는 것은 비효율적입니다. –

+0

흥미 롭습니다 - 누구나 참조가 필요하면 5.4.0의 변경 내역을 참조하십시오 http://php.net/ChangeLog-5.php#5.4.0 –

0

$_SESSION을 사용할 수도 있지만 매우 세련된 해결책은 아닙니다. global을 입력하는 것이 왜 그렇게 어려운가요? 큰 서두가 아니다.

define()도 좋습니다.