jtfairbank
jtfairbank

Reputation: 2307

PHP: Abstract Static Function Best Practice

So you can't make an abstract static function in php.

The alternatives as I see them are to:

  1. Make the function non-static and write extra boilerplate code to create and store the object so I can access that function.

    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. Fill in the static function in my abstract class with a BadMethodCallException, so that any call to a child class which doesn't implement it will throw the exception.

    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
    

I'm leaning towards 2. but was wondering if there's any community consensus on this issue or best practices.

Upvotes: 0

Views: 312

Answers (1)

jtfairbank
jtfairbank

Reputation: 2307

I ended up making an interface with a static function, then implementing the interface in the abstract class. This forces the child classes to define the method, which is basically what I wanted with an abstract static function.

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(...)
  }

}

Upvotes: 1

Related Questions