2010-07-16 2 views
0

가능한 중복은 :
Access global variable from within a class는 PHP에서 클래스 내부에서 "전역을"에 도달하는 방법

나는 다음과 같은 코드가있어 :


$foo = 'foo'; 

class bar 
{ 
    public function __construct() 
    { 
     var_dump($foo); 
    } 
} 

$bar = new bar(); 

이것은 결과 NULL 값. 클래스 바 내부에서 $ foo에 도달 할 수 있습니까? PHP에서 멋진 마술 단어로?

+0

* (관련) * [클래스와 스크립트에서 (데이터베이스 또는 로그인 등) 전역 개체에 액세스하는 가장 좋은 방법은?] (HTTP : //stackoverflow.com/questions/1967548/best-way-to-access-global-objects-like-database-or-log-from-classes-and-scripts) – Gordon

답변

3
global $foo; 
var_dump($foo); 

http://www.ideone.com/OOAsg를 참조하십시오.

는 (왜 인수를 전달하지?) 네, 마법의 단어는 인수

class bar 
{ 
    public function __construct($foo) 
    { 
     var_dump($foo); 
    } 
} 
$foo = 'foo'; 
$bar = new bar($foo); 

당신은 당신의 코드에서 global 키워드를 원하지 않는

+0

수업의 큰 흐름이며 짜증이납니다. 항상 주위에 그것을 전달합니다. 제안 해 주셔서 감사합니다! – Emil

+1

그것은 나쁜 변명입니다. 너무 많은 것을 넘겨야 할 경우 객체 또는 배열을 전달하십시오. – Naktibalda

+1

일부 클래스가 데이터를 변경하는 경우 디버깅하는 것이 귀찮은 일이 아닙니까? 또는 객체가 잘못된 순서로 인스턴스화되었을 때 디버그 할 수 있습니까? – zerkms

4

라고합니다. 기능 (및 방법)은 격리 된 시험 가능한 단위이어야합니다. global 키워드를 사용하면 효과적으로 함수 범위 내의 전역 범위에 대한 종속성을 생성하게됩니다. 인수를 통해 의존성을 주입하는 것이 더 좋고 유지 관리가 쉽습니다.

1

데이터베이스 개체에 액세스하려는 경우 Singleton Pattern을보고 싶을 수도 있습니다. 또한 당신은 레지스트리 사용에 대한 생각 :

class R { 
    public static $foo; 
    public static $db; 
    public static $user; 
    // ... 
} 
// later in code 
R::$db = new PDO(...); 
R::$user = new User(); 
// ... 

을 그리고 당신은 항상 이러한 변수에 액세스 할 수있는 모든 곳에서 (클래스, 함수 및 글로벌 공간을 포함.)

(좋아, 내가 아는이 아니다 getset 방법을 사용하는 실제 레지스트리입니다.하지만 충분하다고 생각합니다.)

+1

레지스트리와 (특히) 싱글 톤은 전역 범위에 대한 의존성을 도입하기 때문에 논쟁의 여지가 있음을 알아야합니다. – Gordon

+0

물론입니다. 하지만 약 10 개의 변수를 넘기는 것보다 쉽습니다.) – NikiC

+0

@nikic 그러면 전역 변수 registryArray와 다른 점은 무엇입니까? – Gordon

1

에밀 - 여기에 조언을 듣고 자제를 철저히 지키지 마십시오. 언제나처럼, 시스템이 프로그램의 다른 부분에서 다양한 방법으로 사용되는 역 참조 된 변수를 통해 회전 할 때가 올 것입니다.

인스턴스 인스턴스화의 문제가 있습니다. 새로운 클래스가 호출 될 순서와 이것이 글로벌 var에 미칠 수있는 영향을 합리적으로 추적 할 수 있습니까 ??

그리고 나중에 개발의 목적을 간과하고 뭔가 다른 용도로 사용할 수 있다는 사실은 많은 막 다른 골목으로 이어질 것입니다. 단어

- 2개월 시간에 정신을 위해 그것을하지 않습니다 ...

짐이 내가 그것을 해결하는 방법입니다

0

.그것은 정말 모든 답변을


class bar 
{ 
    public static $foo; 
} 

$bar::foo = 'foo'; 

덕분에 내 모든 문제를 삭제

+0

에밀 (Emil) - 당신이 정말로이 방법으로 그렇게해야한다면, 이것이 꽤 정적 인 '설정'유형 정보와 트랜잭션 의존적 인 데이터에 사용되고 있다고 말해주십시오 ... 순전히 '관심사' :) –

+0

코드가 작동합니까? '$ bar :: foo'는 일반적으로 변수'$ bar' *에있는 클래스의 * foo * 상수 *에 접근해야합니다. 어쩌면 당신은'bar :: $ foo'를 의미했을까요? – NikiC

0
$foo = 'foo'; 
class bar 
{ 
    public function __construct() 
    { 
    // pay attention to "global" 
    global $foo; 
     var_dump($foo); 
    } 
} 
$bar = new bar(); 
관련 문제