Normal and abstract classes in PHP differ from each other for a simple fact: abstract classes can't be instantiated using the new operator as for normal classes. Generally speaking, abstract classes are used as a mould for other classes. An abstract class is always more generic than a normal class, and this is the main feature that describes abstract classes.
A typical implementation for abstract classes is the underlying structure that handles database connections:
abstract class Database
{
const DB_USER = 'test';
const DB_HOST = 'localhost';
const DB_PWD = 'test';
const DB_NAME = 'test';
abstract protected function connect();
abstract protected function disconnect();
}
Then we can extend this class, for example with a more concrete class:
class MySQL extends Database
{
protected $_connection;
public function __construct()
{
$this->connect();
}
protected function connect()
{
$this->_connection = mysql_connect(self::DB_HOST, self::DB_USER, self::DB_PWD);
mysql_select_db(self::DB_NAME, $this->_connection;
}
protected function disconnect()
{
return @mysql_close($this->_connection);
}
public function __destruct()
{
$this->disconnect();
}
}
Once you have extended the abstract class, you can use the extended class as usual:
$mysql = new MySQL();