2009-11-13 4 views
0

제목에 상태에 따라 부모 클래스에서 메서드를 만들려고합니다. 비록 그것이 어떤 수업이라도 될 수 있다고 생각합니다. 예를 들어 :PHP에서 부모 클래스의 메서드를 호출해야합니다.

class Parent 
    { 
     function foo() 
     { 
      // do stuff 
     } 
    } 

    class Child extends Parent 
    { 
     function bar() 
     { 
      // do stuff after foo() has ran 
     } 
    } 

는 기본적으로, (가) 실행되지 않습니다 실행하거나 하위 클래스해야하는 foo는 원하는 오류를 반환하거나 다른 페이지로 리디렉션합니다. 함수를 호출 할 수 있지만 부모 클래스를 확장 할 때 요구 사항을 만들 수 있는지 궁금합니다.

답변

0

플래그로 작동하는 foo() 함수에서 부울을 설정하지 않는 이유는 무엇입니까? 자식 클래스/함수에 설정되어 있는지 확인하고 모두 설정되어 있는지 확인하십시오.

0

이 기능을 구현하는 유일한 방법 일 수 있다고 생각합니다. 솔루션이 내장되어 있다고는 생각하지 않습니다.

class Parent 
{ 
    public $foo_accessed = FALSE; 
    function foo() 
    { 
     $this->foo_accessed=TRUE; 
     // do stuff 
    } 
} 

class Child extends Parent 
{ 
    function bar() 
    { 
     if($this->foo_accessed==TRUE) { 
      // do stuff after foo() has ran 
     } else { 
      // throw an error 
     } 
    } 
} 
0

아이가 구조의 부모로부터 기능을 호출하게하십시오. ,

class Parent 
{ 
    function foo() 
    { 
     // do stuff 
    } 
} 

class Child extends Parent 
{ 
    function foo() 
    { 
     if(!parent::foo()) { 
      throw new Exception('Foo failed'); 
     } 

     // do child class stuff 
    } 
} 
1

당신이 할 아마해야 할 것은 다음 재정의 부모 :: foo는()를 오버라이드 (override) 된 메소드의 부모 방법과 같이 호출입니다 누락 된 메소드를 구현하기 위해 하위 클래스를 강제합니다.

abstract class ParentClass 
{ 
    public function foo() 
    { 
    // do stuff 
    $this->bar(); 
    } 

    abstract protected function bar(); 
} 

class Child extends ParentClass 
{ 
    protected function bar() 
    { 
    // does stuff 
    } 
} 

bar()을 구현하지 않는 서브 클래스는 심각한 오류를 생성합니다.

11

당신이 추상 클래스와 메소드를 활용할 경우 수 있습니다

class Child extends Parent 
{ 
    function bar() 
    { 
     // do stuff after foo() has ran 
    } 
    function __construct(){ 
     parent::foo(); 
    } 
} 
+0

마지막으로 foo()를 사용하면이를 보호 할 수 있습니다. –

0

다른 방법에 의존하지 마십시오. 그들이 도망 갔는지 확인하십시오. 당신이 foo() 추상적되고 싶어 등은 이미 언급

class Parent 
{ 
    function foo() 
    { 
     // do stuff 
    } 
} 

class Child extends Parent 
{ 
    private function bar() 
    { 
     // do child class stuff 
    } 

    public function doFooBar() 
    { 
    parent::foo(); 
    $this->bar(); 
    } 

} 
0

은 그것을 무시하는 자식 클래스를 강제로 들린다.

PHP에서 추상 클래스를 포함하는 모든 클래스는 부모 클래스도 추상이어야합니다. 즉, 인스턴스화 (생성) 할 수 없으며 파생/하위 클래스 만 생성 할 수 있습니다. 추상 클래스를 인스턴스화하려고하면 컴파일러에서 치명적인 오류가 발생합니다.

http://php.net/manual/en/language.oop5.abstract.php

피터 베일리의 대답에 코드를 참조하십시오.

0

부모 클래스 내의 코드를 실제로 초기화하지 않는 경우 객체 인터페이스를 사용해야합니다. 인터페이스 메소드를 구현해야하거나 스크립트가 태아 오류를 발생시킵니다.

자세한 내용은 http://us3.php.net/interface에서 확인할 수 있습니다.

0

다음 처리 방법은 모든 처리가 완료된 후에 만 ​​불만을 토로합니다. 그러나 공정한 것이라면 반드시 foo()이 부모 클래스에서 호출되었거나 처리 할 수있는 조건을 트리거해야합니다.

class DemandingParent { 

    private $hasFooBeenCalled = false; 

    public function foo() { 
     $this->hasFooBeenCalled = true; 

     /* do Stuff */ 
    } 

    public function __destruct() { 
     if (!$this->hasFooBeenCalled) { 
      throw new Exception("Naughty Child! Call your parent's foo b4 you speak up!"); 
     } 
    } 
} 
관련 문제