There are similarities in that both define a sort of template for any class which extends (abstract class) or implements (interface) them, as they require that certain methods be defined by the extending/implementing class, creating a sort of "contract" whereby the extending/implementing class is guaranteed to provide certain attributes. Also, any such class can then be type-hinted by any class it extends -- including abstract class -- or any interface it implements.
The abstract class has the advantage that it can also have class variables defined for it as well as non-abstract methods, which can all then be inherited by a child class. The interface has an advantage in that you can implement as many different interfaces as you need for a given class definition, whereas a class can only ever extend a single parent class, whether it be abstract or not. Therefore, to maximize flexibility, it's probably best to first think in terms of interfaces, and then only go with an abstract class when you determine a need to have it include class variables and/or pre-defined methods.