Introduction
Before diving deep into the difference between abstract class and interface, you must understand one basic thing: these are two completely different classes that cannot be used as an alternative to one another.
Interface classes completely empty the shells while expecting child classes to implement everything for them. Abstract classes not only contain the common piece of information between the shells inside but also expect the child classes within to fill in the gaps.
Let us dive in a bit deeper to actually understand the difference minutely.
If you want to read about PHP Array questions then you can visit here. This will help you crack your PHP interviews.
Interface Class
As we already know, an interface is actually defined by an interface keyword where all the methods are abstract. In addition to this, all the methods declared in this type of class must be declared in public which reflects the true nature of an interface.
Let's help to demonstrate that with an example:
- interface Logger {
- public
- function execute[];
- }
As you can see above, in the interface, the method body is not defined. Only the name and the parameters are being defined. Now, let's move on to the abstract class.
Abstract Class
In PHP, an abstract class is one being partially implemented by any developer. It might contain at least one abstract method which is basically a method without any written code. It just contains the name and the parameters and has been marked as “abstract”.
By definition, an abstract class is simply a function definition whose purpose is to serve the programmer by telling them the method in question must be implemented in a child class.
Here is an example to demonstrate the abstract class:
- abstract class AbstractClass {
- abstract protected
- function getValue[];
- public
- function printOut[] {
- print $this - > getValue[].
- "\n";
- }
- }
Now that you have been acquainted with what is an abstract an interface class, its time to delve into their differences, step by step.
Here’s a table depicting the difference between abstract and interface class in PHP.
Interface Class | Abstract Class |
Interface class supports multiple inheritance feature | Abstract class does not support multiple inheritances. |
This does not contain a data member. | Abstract class does contain a data member. |
The interface does not allow containers. | The abstract class supports containers. |
An interface class only contains incomplete members which refer to the signature of the member. | Abstract class contains both incomplete[i.e. abstract] and complete members. |
Since everything is assumed to be public, an interface class does not have access modifiers by default. | An abstract class can contain access modifiers within subs, functions, and properties. |
Any member of an interface cannot be static. | Only a complete member of the abstract class can be static. |
Conclusion
Now that you have learned abstract class and interface differences, it will be much easier to implement them on your project.
Also, just would like to add here that just because any other OO language has some kind of interfaces and abstraction too doesn't mean they have the same meaning and purpose as in PHP. The use of abstraction/interfaces is slightly different while interfaces in PHP actually don't have a real function. They merely are used for semantic and scheme-related reasons. The point is to have a project as much flexible as possible, expandable and safe for future extensions regardless whether the developer later on has a totally different plan of use or not.
If your English is not native you might lookup what Abstraction and Interfaces actually are. And look for synonyms too.
And this might help you as a metaphor:
INTERFACE
Let's say, you bake a new sort of cake with strawberries and you made up a recipe describing the ingredients and steps. Only you know why it's tasting so well and your guests like it. Then you decide to publish your recipe so other people can try that cake as well.
The point here is
- to make it right
- to be careful
- to prevent things which could go bad [like too much strawberries or something]
- to keep it easy for the people who try it out
- to tell you how long is what to do [like stiring]
- to tell which things you CAN do but don't HAVE to
Exactly THIS is what describes interfaces. It is a guide, a set of instructions which observe the content of the recipe. Same as if you would create a project in PHP and you want to provide the code on GitHub or with your mates or whatever. An interface is what people can do and what you should not. Rules that hold it - if you disobey one, the entire construct will be broken.
ABSTRACTION
To continue with this metaphor here... imagine, you are the guest this time eating that cake. Then you are trying that cake using the recipe now. But you want to add new ingredients or change/skip the steps described in the recipe. So what comes next? Plan a different version of that cake. This time with black berries and not straw berries and more vanilla cream...yummy.
This is what you could consider an extension of the original cake. You basically do an abstraction of it by creating a new recipe because it's a lil different. It has a few new steps and other ingredients. However, the black berry version has some parts you took over from the original - these are the base steps that every kind of that cake must have. Like ingredients just as milk - That is what every derived class has.
Now you want to exchange ingredients and steps and these MUST be defined in the new version of that cake. These are abstract methods which have to be defined for the new cake, because there should be a fruit in the cake but which? So you take the black berries this time. Done.
There you go, you have extended the cake, followed the interface and abstracted steps and ingredients from it.