Inheritance in PHP
Introduction
Inheritance is a fundamental concept in object-oriented programming (OOP) that allows one class to inherit the properties and methods of another class. It promotes code reusability and a hierarchical class structure. In PHP, inheritance is achieved using the extends keyword.
Basic Inheritance
To demonstrate basic inheritance, we will create two classes: a parent class Animal and a child class Dog that inherits from Animal.
<?php
class Animal {
public $name;
public function __construct($name) {
$this->name = $name;
}
public function eat() {
echo $this->name . " is eating.\n";
}
}
class Dog extends Animal {
public function bark() {
echo $this->name . " is barking.\n";
}
}
$dog = new Dog("Buddy");
$dog->eat();
$dog->bark();
?>
Buddy is barking.
In this example, the Dog class inherits the name property and eat method from the Animal class and adds a new method bark.
Overriding Methods
Child classes can override methods of their parent class. This allows the child class to provide a specific implementation for a method that is already defined in the parent class.
<?php
class Animal {
public $name;
public function __construct($name) {
$this->name = $name;
}
public function eat() {
echo $this->name . " is eating.\n";
}
}
class Dog extends Animal {
public function eat() {
echo $this->name . " is eating dog food.\n";
}
}
$dog = new Dog("Buddy");
$dog->eat(); // Outputs: Buddy is eating dog food.
?>
In this example, the Dog class overrides the eat method of the Animal class to provide a specific implementation.
Using the Parent's Constructor
When a child class overrides the constructor, it can still call the parent's constructor using the parent::__construct method.
<?php
class Animal {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
class Dog extends Animal {
public $breed;
public function __construct($name, $breed) {
parent::__construct($name);
$this->breed = $breed;
}
public function display() {
echo $this->name . " is a " . $this->breed . ".\n";
}
}
$dog = new Dog("Buddy", "Golden Retriever");
$dog->display(); // Outputs: Buddy is a Golden Retriever.
?>
In this example, the Dog class's constructor calls the Animal class's constructor using parent::__construct($name).
Access Control
PHP provides three levels of access control for class members: public, protected, and private.
public: Accessible from anywhere.protected: Accessible within the class itself and by inheriting classes.private: Accessible only within the class itself.
<?php
class Animal {
public $name;
protected $type;
private $age;
public function __construct($name, $type, $age) {
$this->name = $name;
$this->type = $type;
$this->age = $age;
}
public function display() {
echo $this->name . " is a " . $this->type . " and is " . $this->age . " years old.\n";
}
}
class Dog extends Animal {
public function getType() {
return $this->type; // Accessible because it's protected
}
}
$dog = new Dog("Buddy", "Dog", 5);
$dog->display();
echo $dog->getType(); // Outputs: Dog
?>
Dog
In this example, the $type property is protected, so it is accessible within the Dog class, while the $age property is private, so it is only accessible within the Animal class.
Final Keyword
The final keyword prevents a class from being inherited or a method from being overridden.
<?php
final class Animal {
public $name;
public function __construct($name) {
$this->name = $name;
}
final public function display() {
echo $this->name . " is an animal.\n";
}
}
// This will cause an error
class Dog extends Animal {
// Cannot override final method
public function display() {
echo $this->name . " is a dog.\n";
}
}
?>
In this example, attempting to inherit from the Animal class or override the display method will result in an error because they are declared as final.
