2014-05-22 2 views
0

So you can't make an abstract static function in php.PHP : 추상 정적 기능 모범 사례

대안을 내가 그들을 보는 바와 같이 다음과 같다

  1. 함수 비 정적 확인하고 만들 수있는 여분의 상용구 코드를 작성하고 객체를 저장 그래서 해당 기능에 액세스 할 수 있습니다. 그것을 구현하지 않는 자식 클래스에 대한 호출이 예외를 던질 수 있도록

    abstract class Foo { 
    
        abstract public function bar(); 
    
    } 
    
    abstract class Good { 
    
        public function bar() { 
        ... 
        } 
    
    } 
    
    // boilerplate to access Good->bar()... potentially a lot in multiple files 
    $g = new Good(); 
    $g->bar(); 
    
  2. BadMethodCallException 내 추상 클래스의 정적 함수를 작성.

    abstract class Foo { 
    
        public static function bar() { 
        throw new BadMethodCallException("Not Implemented By Child Class :("); 
        } 
    
    } 
    
    class Good extends Foo { 
    
        public static function bar() { 
        // ... 
        } 
    
    } 
    
    class Bad extends Foo { 
    
        // no bar implementation 
    
    } 
    
    Good::bar(); // works 
    Bad::bar(): // exception 
    

나는 2쪽으로 기울고 있어요하지만이 문제 또는 모범 사례에 어떤 사회 합의가 있는지 궁금 해서요.

+0

정적 추상 메서드를 어떻게 호출할까요? 아마도 함수를 호출하는 방법을 설명하면 솔루션을 제안 할 수 있습니다. – scragar

+0

자식 클래스에서 정적 추상 메서드를 구현 한 다음 호출하고 싶습니다. 예 :'Good :: bar()'. – jtfairbank

+0

당신이 사용하고있는 클래스를 알게된다면 추상 스텁은 쓸모가 없게됩니다. 왜냐하면 추상 클래스는 필수가 아니기 때문에 실제 클래스에만 필요하기 때문입니다. – scragar

답변

1

정적 함수를 사용하여 인터페이스를 작성한 다음 추상 클래스에 인터페이스를 구현했습니다. 이것은 자식 클래스가 메서드를 정의하도록 강제합니다. 이것은 기본적으로 추상적 인 정적 함수로 원했던 것입니다.

interface ModelFactoryInterface { 
    public static function offer(); 
} 

abstract class ModelHelper implements ModelFactoryInterface { 

    protected $tester; 

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

} 

/* Location 
* ------------------------------------------------------ */ 
final class LocationHelper extends ModelHelper { 

    public static function offer() { 
    return new Location(...) 
    } 

}