PHP OOP - Abstract classes

The abstract classes and methods are used to create a model of minimum required methods which must be defined in normal sub-classes derived from an abstract class (with extends).
An abstract class is created with the abstract keyword.
An abstract class cannot be instantiated, can only be inherited by other sub-classes extended from it.


The abstract methods are declared with the abstract keyword, and cannot have an implementation, they simply declare the method's signature.
abstract public function methodName($arguments);
Abstract methods are only created in an abstract class.

  - Example:
In this example is created an abstract class with a property ($name), an abstract method ( greetName() ) and a normal method ( setName() ).
<?php
// AbstractClass class
abstract class AbstractClass {
  protected $name;

  // declare an abstract method
  abstract public function greetName($greet);

  // define a normal method
  public function setName($name) {
    $this->name = $name;        // sets the value of $name property
  }
}
?>
Any attempt to create an object instance of the AbstractClass will cause an error like this:
Fatal error: Cannot instantiate abstract class AbstractClass in ...
As you can see in the example above, the abstract method, greetName() does not have an implementation code, but, by declarating this method abstract, you ensure that it must be defined by all child class derived from AbstractClass.
The abstract methods declared in the parent class must be defined in the child classes with the same (or a less restricted) attribute of access, and the same number of arguments.

In the next example we create a child class derived from AbstractClass. This subclass must contain the greetName() method becouse it is marked abstract in the parent class.
<?php
// ... include AbstractClass code

// a child class derived from AbstractClass
class ChildClas extends AbstractClass {
  // the required method
  public function greetName($greet) {
    return $greet. ' '. $this->name;
  }

  // another method, returns today's date
  public function todayDate() {
    return 'Today: '. date('l, j-n-Y');
  }
}
?>
If we were to create a child class derived from AbstractClass that does not implement the greetName() method, will generate an error like this:
Fatal error: Class ChildClas contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (AbstractClass::greetName) in ...

Child classes and their instances can uses the public and protected elements created in the abstract parent class.
For example:
<?php
// ... include ChildClas code

// object instance of ChildClas
$obj = new AbstractClass();

// calls setName(), defined in AbstractClass
$obj->setName('MarPlo');

// access the methods defined in ChildClas class
echo $obj->greetName('Welcome');
echo '<br />'. $obj->todayDate();
?>
Will display:
Welcome MarPlo
Today: Saturday, 2-4-2011