Как отследить вызов метода объекта PHP?
Все делается проще: есть свойство instance, которое изначально равно null. При вызове метода getInstance() проверяем, равно ли instance null (self::$instance === null), если да - создаем объект, сохраняем в instance и возвращаем его, иначе просто возщвращаем instance:class Foo 
{
    private static $instance;

    private function __construct()
    {
    }

    public static function getInstance()
    {
        if (self::$insrance === null)
        {
            self::$insrance = new Foo();

            return self::$instance;
        }

        return self::instance;
    }
}
Можно и так. Статические методы сделайте 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