2012-12-15 4 views
2

가능하여 키워드/주석, @overridePHP에서 재정의 하시겠습니까? <code>implements</code> 같은 우리가 함수를 재정의 할 수 있습니다 자바와 같은 다른 객체 지향 언어에서

PHP에서 그렇게 할 수있는 방법이 있나요? 내 말은, 예 :

class myClass { 
    public static function reImplmentThis() { //this method should be overriden by user 
    } 
} 

나는 사용자가 자신의 myClass::reImplementThis() 메서드를 구현하기를 원합니다.

PHP로 어떻게 할 수 있습니까? 가능하면 옵션으로 만들 수 있습니까?

사용자가 메서드를 구현하지 않은 경우 기본 메서드를 지정할 수 있습니까? 아니면 메서드가 정의되지 않았 음을 나타낼 수 있습니까? method_exists을 사용하여이 작업을 수행 할 수 있습니까?

+2

정확히 상속을위한 것입니다. http://php.net/manual/en/language.oop5.inheritance.php –

+2

일반적으로 정적이 아닌 객체로 만들면 사용자는 myClass를 확장 할 수 있습니다. 즉, reImplmentThis를 재정의할지 여부를 선택합니다 ()'. 기본 구현이 수용 가능한 경우 사용자 구현의 존재 여부를 테스트 할 필요가 없습니다. – halfer

+1

당신은 final 클래스를 사용하여 (halfer가 말하는 것처럼) 확장 할 수 있고 인터페이스 클래스 (http://www.killerphp.com/articles/php-interfaces/)를 사용하여 final 클래스가 최소한 함수를 갖도록 할 수 있습니다 당신이 지정합니다. 나는 단지 잘못 (인터페이스)에 대해서 배울 뿐이지 만, 내가 읽은 것에서는 그것을 가지고있는 것 같다. – qooplmao

답변

1
<?php 
abstract class Test 
{ 
    abstract protected function test(); 

    protected function anotherTest() { 

    } 
} 

class TestTest extends Test 
{ 
    protected function test() { 

    } 
} 

$test = new TestTest(); 
?> 

이렇게하면 TestTest 클래스는 기능 테스트를 무시해야합니다.

+1

OP의 경우,'reImplementThis()'는 추상 구현이 아닌 것으로 선언 될 것입니다. 왜냐하면 기본 구현은 괜찮기 때문입니다. 하지만 네, +1. – halfer

+0

@Dillen이 질문은 사용자가 묻는 질문에 대한 대답이 아니며, 어떻게 수행되어야하는지에 대한 변형이지만 사용자가 요구하는 것을 만족시키지 못합니다 – pal4life

0

예, 있습니다. 클래스를 확장하고 기본 클래스에있는 것과 동일한 이름, 함수 특성 및 액세스 지정자 (공개 또는 보호 된)로 메소드를 정의하여 메소드를 겹쳐 쓸 수있는 옵션이 있습니다. 메서드는 기본 클래스에서 abstract로 선언하면 안되며 파생 클래스에서이 메서드를 구현해야합니다. 당신이 예제에서는이 다음과 같이합니다 : 사용자가이를 무시하지 않는 경우

class MyClass { 
    public static function reImplmentThis() { //this method should be overriden by user 
    } 
} 

class MyDerivedClass extends MyClass { 
    public static function reImplmentThis() { //the method you want to call 
    } 
} 

이 MyDerivedClass 여전히 reImplmentThis() 메소드, MyClass에로부터 상속 한 것입니다.

즉, 파생 된 클래스에서 확장 된 정적 메서드를 호출하여 문제가 발생하지 않도록 조심해야합니다. 정적 클래스를 확장해야 할 필요가 없다면 인스턴스 메소드를 확장하도록 코드를 리팩터링하는 것이 좋습니다. 정적 수업을 확장하는 것보다 더 좋은 방법이 없다고 판단하면 Late Static Binding을 잘 이해하십시오.

예, 메서드가 구현되는지 여부를 확인하고 PHP Reflection을 사용하여 클래스에 대한 정보를 훨씬 더 얻을 수 있습니다.