2013-01-14 2 views
0

이것은 쉽습니다. 누군가 나를위한 구문을 설명 할 수 있습니까?PHP 상위 클래스의 클래스 객체에 액세스

config 클래스를 인스턴스화하는 부트 스트랩 클래스 (new 키워드)를 인스턴스화하는 컨트롤러가 있습니다.

컨트롤러는 부트 스트랩 클래스를 확장하는 시작 페이지 클래스를 인스턴스화합니다. startpage 클래스에서 부트 스트랩 (부모) 클래스의 config 객체에 액세스하려고합니다.

이 작업을 수행 할 수도 있습니까? 또는 시작 페이지가 부트 스트랩을 직접 인스턴스화해야합니까? 부트 스트랩을 확장하고 부트 스트랩을 덮어 쓰는 시작 페이지를 인스턴스화합니까? 또는 내 구문이 잘못 되었습니까?

컨트롤러 (인덱스 페이지)

try { 
    if (!include($paths['root'] . $paths['framework'] . '/core/AutoLoader.php')) { 
     throw new Exception ('<b>Error - AutoLoader is missing</b>'); 
    } 
    $loader = new AutoLoader($paths); 
    $appStack = new BootStrap($paths); 
    $app  = new StartPage(); 
    $app->start(); 
} catch (Exception $e) { 
    echo 
     '<p><b>EXCEPTION</b><br />Message: ' 
     . $e->getMessage() 
     . '<br />File: ' 
     . $e->getFile() 
     . '<br />Line: ' 
     . $e->getLine() 
     . '</p>'; 
} 

부트 스트랩 클래스 :

class BootStrap { 
    protected $config; 

    /** 
    * -------------------------------------------------------------------------- 
    ** GETTERS 
    * -------------------------------------------------------------------------- 
    * 
    */ 
    public function getConfig() { return $this->config; } 

    /** 
    * -------------------------------------------------------------------------- 
    * __construct() 
    * PUBLIC method 
    * = Starts a new session, loads stylesheets, loads classes 
    * -------------------------------------------------------------------------- 
    * 
    */ 
    public function __construct($paths) { 

     /** 
     * -------------------------------------------------------------------------- 
     * load Config class 
     * -------------------------------------------------------------------------- 
     * 
     */ 
     try { 
      if (!class_exists('Config')) { 
       throw new Exception ('<b>Error - Configuration class is missing</b>'); 
      } 
      $this->config  = new Config(); 
     } catch (Exception $e) { 
      echo 
       '<p><b>EXCEPTION</b><br />Message: ' 
       . $e->getMessage() 
       . '<br />File: ' 
       . $e->getFile() 
       . '<br />Line: ' 
       . $e->getLine() 
       . '</p>'; 
     } 
    } 
} 

시작 페이지 클래스 :

class StartPage extends BootStrap { 

    /** 
    * -------------------------------------------------------------------------- 
    * __construct() 
    * PUBLIC method 
    * = Starts a new session, loads stylesheets, loads classes 
    * -------------------------------------------------------------------------- 
    * 
    */ 
    public function __construct() { 
    } 

    /** 
    * -------------------------------------------------------------------------- 
    * Start() 
    * PUBLIC method 
    * = loads the web page 
    * -------------------------------------------------------------------------- 
    * 
    */ 
    public function Start() { 

     // path to includes 
     $inc_path = $this->paths['root'] . $this->paths['medium']; 

     // instantiate page, html header 
     $charset  = $this->config->getCharset(); 
     $title  = $this->config->getTitle(); 
     $description = $this->config->getDescription(); 
    } 
} 
+0

'parrent :: obj' .. – Davit

+0

'Configuration class is missing'예외가 표시됩니까? – hohner

+0

그것을 시도했다. ** $ charset = parent :: $ config-> getCharset(); ** ... 같은 오류. – obmon

답변

2

을 사용하여 다음과 같은

protected $config; 

public function __construct() 
{ 
    $this->config = $this->getConfig(); 
} 

또는, 그것을 완전히 넘어 뜨렸다. 따라서 $foo = new StartPage()StartPage 클래스의 __construct() 코드를 실행합니다.

부모 클래스 인 Bootstrap 코드에서도 __construct() 코드를 실행하려면 parent::__construct()을 사용하여 명시 적 호출을 추가해야합니다.

  1. 실행 코드를 모두 전에 부모 후에 : PHP 당신을 위해이 작업을 수행하지 않는 이유 경우

    당신은 자동 인 경우에 당신이 할 수없는 여기에 세 가지가 있습니다 궁금 생성자 인 경우 parent::__construct()에 언제 호출할지 선택합니다.

  2. 나머지 클래스를 상속하면서 전체 생성자 논리를 다른 것으로 바꿉니다.
  3. 항상 부모 클래스에 자동으로 선택 될 수 있지만 부모 클래스에 명시 적으로 제공되어야하는 부모 생성자에 값을 전달합니다.

편집 : 부모의 특정 인스턴스를 생성, 아래의 추가 해명을 요약하면 (Bootstrap) 클래스 (StartPage를) 같은 클래스 또는 하위 클래스의 다른 인스턴스 이후 작품에 대한 차이를 만들 수 없습니다 ; 각각은 별도의 객체이며 __construct을 독립적으로 호출합니다.

StartPage 개체가 Bootstrap 클래스의 특정 인스턴스를 참조하도록하려면 상속이 올바른 메커니즘이 아닙니다. 대신, 생성 된 Bootstrap 인스턴스를 어떤 형태의 Dependency Injection을 통해 각 StartPage 인스턴스로 전달해야합니다.

+0

하지만 이미 컨트롤러에서 Bootstrap을 호출하고 있습니다. 나는 이것을 보여주기 위해 원래의 글을 편집했다. – obmon

+0

그래서 부트 스트랩의 생성자는 두 곳에서 두 번 호출 될 수 있습니까? 나는 이걸로 혼란 스럽다. – obmon

+0

@obmon 나는 당신이 클래스와 객체를 혼란스럽게한다고 생각한다. 새로운'StartPage' 객체를 생성 할 때 생성 된 다른 객체들, 클래스'Bootstrap' 또는'StartPage'에 대해서는 아무것도 알지 못합니다. 당신이해야 할 일은 특정 'StartPage' 객체의 데이터를 초기화하는 것이며, 단지'StartPage :: __ construct()'만이 그렇게 할 수 있습니다. – IMSoP

0

는의 생성자를 호출 명시 적으로 하위 클래스의 생성자를 구현하는 시도 부모. 시작 페이지에서

public function __construct() { 
    parent::__construct(); 
} 
+0

하지만 컨트롤러에서 클래스의 이전 인스턴스를 덮어 쓰지 않을까요? 다소 익숙하지 않은 것 같습니다. – obmon

+1

사실, 클래스의 객체는 어쨌든 한 번만 인스턴스화됩니다. 하위 클래스가 호출 될 때 수퍼 클래스에서 생성자가 호출되는지 확인하는 것뿐입니다. – xelber

0

: xelber의 대답은, 가능한 빨리 StartPage 자신의 __construct() 방법, 효과적으로 "숨기기"Bootstrap의 하나를 제공으로 parent::__construct();

+1

기존 인스턴스화를 상속하고 복사하여 붙여 넣기를 원하지 않습니다. – IMSoP

+0

위의 변수 선언이 작동합니다. 이 신화 '우리'가 누구인지 확실하지 않습니다. – hohner

관련 문제