2010-11-19 5 views
0

작업중인 프레임 워크 프로젝트의 "슈퍼 오브젝트"(CodeIgniter의 것과 비슷합니다)를 만드는 데 문제가 있습니다.슈퍼 오브젝트의 가변 범위 문제

다른 모든 클래스가 실행되는 슈퍼 오브젝트를 만들고 싶습니다. 그랬지 만 모든 함수에서 global 키워드를 사용하지 않고 각 클래스에서 슈퍼 객체의 객체를 사용할 수없는 것 같습니다. 내가 이것을 실행하면 나는 AA 방법을 액세스 할 수 없기 때문에

class a 
{ 
    function aa() 
    { 
     return 'class a'; 
    } 
} 

class b 
{ 
    function bb() 
    { 
     $blah->a->aa(); 
    } 
} 

class superobj 
{ 
    function loadClass($class) 
    { 
     $this->$class = new $class; 
    } 
} 

class blah extends superobj 
{ 
    function __construct() 
    { 
     $this->loadClass('a'); 
     $this->loadClass('b'); 
    } 
} 

$blah = new $blah; 

그래서, 나는 오류가 발생 :

나는 이런 식으로 뭔가가있다. 전역 $ blah를 메서드 bb에 넣으면 작동합니다 (또는 적어도 실제 프로젝트에서는이 5 초 모형을 사용하지 않습니다).

모든 방법으로 참조 할 필요가 없도록 $ blah 개체를 전역으로 만들 수있는 방법이 있습니까? 아니면 내가 수행하려고하는 것을 달성하는 더 좋은 방법이 있습니까? 나는 OOP에서 아주 좋은 아니에요

...

+0

가능한 복제본 : http://stackoverflow.com/questions/1234445/php-global-variables – thomaspaulb

답변

3
function bb() { 
    $blah->a->aa(); 
} 

는 사실, 어떤 기능으로,이 기능의 범위에는 변수가 없습니다. $blah은 함수에 전달되지 않았거나 함수에 정의되어 있지 않으므로 존재하지 않습니다.

개체가 작동하려면 blah의 인스턴스에 의존하는 경우 생성자에 전달해야합니다.

class b { 

    var $blah = null; 

    function __construct($blah) { 
     $this->blah = $blah; 
    } 

    function bb() { 
     $this->blah->foo(); 
    } 
} 

$b = new b($instanceOfBlah); 

는 다른 방법으로, 전역 개체에 대한 참조를 보유하고 있으며 ( $blah = Registry::get('blah') 같은 레지스트리 패턴) 요청을 반환하는 정적 클래스를 사용합니다.

global을 사용하지 마십시오. 그냥 하지마.

+0

내가 blah의 생성자에게이 작업을 수행 할 수있는 방법이 있나요? 그래서 blah를 확장하는 모든 클래스는 자동으로 해당 클래스를 사용할 수 있습니다. 행동 양식? – Scott

+0

@Scott 클래스 *가 * blah를 확장하는 경우 당연히 클래스의 메서드를 자체 클래스처럼 사용할 수 있습니다. – deceze

+0

나는 이것을 설명하려고 노력할 것이다. 위 예제에서와 같이 "class a"의 메서드를 사용할 수 없다 "superobj"를 통해 "class b"를로드하면 superobj 바깥에 "class b"를로드하면 작동합니다. 그러나 superobj를 통해로드 할 수 있어야하므로 모든 라이브러리에 대해 하나의 객체 만 사용해야합니다. 편집 : 위의 예제에서 나는 실제 프로젝트에서 나는 어쩌면 확장 할 수는 없지만 $ this-> a -aa를 호출하면 작동하지 않는다는 것에주의하십시오. – Scott