Object-Oriented PHP: Inheritance

Prior to this lesson, we've learned about Encapsulation. In this lesson we will be talking about inheritance. Inheritance is fairly easy concept to understand. It's like in real world that children inherit some of their attributes and behavior from their parents.
Let's use the parent and child analogy in this example:
<?php
class Mother
{
public function getHairColor()
{
return 'black';
}
}
class Child extends Mother
{
}
$child = new Child;
echo $child->getHairColor();
As you can see, this is inheritance in action because the Child
class can access the getHairColor
method of the Mother
class using the extends
keyword. If you encounter a class that uses the extends
keyword, that means that class can inherit any public or protected methods from the class it extends. Please take note that only public and protected methods or properties can be inherited, because as what we've discussed in our encapsulation lesson private properties or methods can only be accessed within the class that owns it.
When to use inheritance?
Now that we know the basic of inheritance, what are the other scenario that inheritance can be useful? Okay, let's have another example. Let's say we have aRectangle
class that extends the Shape
class:
<?php
class Shape
{
protected $length = 5;
protected $width = 10;
public function getArea()
{
return $this->length * $this->width;
}
}
class Rectangle extends Shape
{
}
$rectangle = new Rectangle;
echo $rectangle->getArea();
We know in math that in order to get the area of a rectangle we have to multiply its length by its width. So, in this example there is no problem using the getArea
method from the parent class.However, when it comes to triangle the formula will be a little bit different. How are we going to solve that? Well, we are going to simply overide the method from the parent class. One of the important concepts of inheritance is that if you need to overide functionality in your parent class then simply overide it, because anything in the child class will take precedence over the parent class.
<?php
class Shape
{
protected $length = 5;
protected $width = 10;
public function getArea()
{
return $this->length * $this->width;
}
}
class Triangle extends Shape
{
protected $base = 10;
protected $height = 12;
public function getArea()
{
return $this->base * $this->height / 2;
}
}
$triangle = new Triangle;
echo $triangle->getArea();
Now, maybe you're thinking that our
Shape
class in useless because we can't reuse the getArea
method. Well, in this case yes. But if you find your self repeating functionality or attributes in every classes that you working, it's a sign that you have to use inheritance.If we're going to take this a little bit further, we can use the
Shape
class as a contract. What I mean by contract is that every time you create a shape, like for example a circle, that class must have a getArea
method. We can use an abstract class for that.An abstract class is a class that you can add functionality but cannot be instantiated.
<?php
abstract class Shape
{
abstract protected function getArea();
}
class Circle extends Shape
{
}
$circle = new Circle;
When we run this code we should get a fatal error.
Fatal error: Class Circle contains 1 abstract method and must therefore be declared
abstract or implement the remaining methods (Shape::getArea)
in D:\Tutorials\Laragle\PHP\OOP\Inheritance.php on line 11
To fix that we have to create a
getArea
method in our Circle
class.
<?php
abstract class Shape
{
abstract protected function getArea();
}
class Circle extends Shape
{
protected $radius = 5;
public function getArea()
{
return M_PI * pow($this->radius, 2);
}
}
$circle = new Circle;
echo $circle->getArea();
That's all for this lesson. I hope that this lesson helps you understand a little bit about inheritance. If you have some questions please don't hesitate to comment it down below. See you on the next lesson.
Previous: EncapsulationNext: Interfaces
Post a Comment