2012-01-22 3 views
4

가능한 중복 : 전화 정적 메서드 상속 인터페이스


Referring to a static member of a subclass

내 문제를 이해하기 위해 다음 코드에서 참조하시기 바랍니다.

<?php 

Interface IDoesSomething 
{ 
    public static function returnSomething(); 
} 

abstract class MiddleManClass implements IDoesSomething 
{ 
    public static function doSomething() 
    { 
     return 1337 * self::returnSomething(); 
    } 
} 

class SomeClass extends MiddleManClass 
{ 
    public static function returnSomething() 
    { 
     return 999; 
    } 
} 

// and now, the vicious call 
$foo = SomeClass::doSomething(); 

/** 
* results in a 
* PHP Fatal error: Cannot call abstract method IDoesSomething::returnSomething() 
*/ 
?> 

추상적 인 "중개인"클래스에 정의 된 함수의 함수를 호출 할 수있는 가능성을 유지하면서 returnSomething()의 추상화를 강제 할 수있는 방법이 있나요? 나에게 PHP의 병목 현상처럼 보입니다.

+0

내 질문은 근본적으로 다르다. – Daniel

+0

구체적인 문제는 다소 (근본적으로는 아니지만) 다르지만 추상 문제 (LSB)는 동일합니다. – Gordon

답변

9

당신이 정적을 사용하는 이유는 PHP 버전> = 5.3은 다음

public static function doSomething() 
{ 
    return 1337 * static::returnSomething(); 
} 
2

public static function doSomething() 
{ 
    return 1337 * self::returnSomething(); 
} 

를 변경하는 경우, 그것은 아주 좋은 OOP 아닌가요? Statics는 상속에서 사용하기에 좋지 않습니다. 이는 해당 클래스에 대해 특별히 기능을 제공하기위한 것입니다. 이것은 당신이 필요로하는 것을합니다.

<?php 

Interface IDoesSomething{ 
    public function returnSomething(); 
} 

abstract class MiddleManClass implements IDoesSomething{ 
    public function doSomething(){ 
     return 1337 * $this->returnSomething(); 
    } 
} 

class SomeClass extends MiddleManClass{ 
    public function returnSomething(){ 
     return 999; 
    } 
} 

$someClass = new SomeClass(); 
$foo = $someClass->doSomething(); 
+0

통계학을 사용하지 않으면 불행히도 프로젝트에 따라 요구 사항이 충족되지 않습니다 ... 좀 더 추상적 인 용어로 말하면 전적으로 당신과 동의합니다. – Daniel

+0

그렇다면 통계는 유일한 해결책 일 것 같지 않으므로 디자인을 다시 평가할 것입니다 ... – Robert

2

이 문제는 "늦게 정적 바인딩"로 알려져 : 답변은 동일하지만 php manual