Можно и так. Статические методы сделайте private/protected. Используя PHPDoc укажите какие именно публичные методы доступны для вызова. Метод __callStatic будет перехватывать попытки вызова закрытых методов, вы сперва проверите наличие этого метода, потом сделаете нужную вам инициализацию и потом лишь передадите управление этому методу.
Вот вам пример. Но я бы не советовал его использовать в реальных приложениях - он плохо пахнет.
/**
* @method static mixed one()
* @method static mixed two()
* @method static mixed three()
*/
class Auto
{
protected static $instance;
public static function __callStatic ( $name, $arguments )
{
if ( static::$instance === null ) {
static::$instance = new static();
}
$method = "static_{$name}";
if ( method_exists( static::$instance, $method ) ) {
return call_user_func_array( [ static::$instance, $method ], $arguments );
}
throw new BadMethodCallException( '...' );
}
protected function static_one ()
{
echo 'Вызов метода ' . __METHOD__ . PHP_EOL;
}
protected function static_two ()
{
echo 'Вызов метода ' . __METHOD__ . PHP_EOL;
}
protected function static_three ()
{
echo 'Вызов метода ' . __METHOD__ . PHP_EOL;
}
}
Auto::one(); # Вызов метода AutoCreate::static_one
Auto::two(); # Вызов метода AutoCreate::static_two
Auto::three(); # Вызов метода AutoCreate::static_three