So you can't make an abstract static function in php.
我认为它们的替代方案是:
使函数非静态并编写额外的样板代码来创建和存储对象,以便我可以访问该函数。
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();
使用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 :(得分: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(...)
}
}