PHP:抽象静态函数最佳实践

时间:2014-05-22 10:03:51

标签: php inheritance static abstract

So you can't make an abstract static function in 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
    
  3. 我倾向于2.但是想知道在这个问题或最佳实践方面是否有任何社区共识。

1 个答案:

答案 0 :(得分: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(...)
  }

}