PHP::A way of using abstract class

abstract class ParamHandler {
    protected $source;
    protected $params = array();
    function __construct( $source ) {
        $this->source = $source;
    }
    function addParam( $key, $val ) {
        $this->prams[$key] = $val;
    }
    function getAllParams() {
        return $this->params;
    }
    static function getInstance( $filename ) {
        if ( preg_match( "/\.xml$/i", $filename )) {
            return new XmlParamHandler( $filename );
        }
        return new TextParamHandler( $filename );
    }
    abstract function write();
    abstract function read();
}
class XmlParamHandler extends ParamHandler {
    function write() {
        // write XML
        // using $this->params
        echo "write xml format" . "<br/>";
    }
    function read() {
        // read XML
        // and populate $this->prams
        echo "read xml format" . "<br/>";
    }
}
class TextParamHandler extends ParamHandler {
    function write() {
        // write text
        // using $this->params
        echo "write text format" . "<br/>";
    }
    function read() {
        // read text
        // and populate $this->prams
        echo "read text format" . "<br/>";
    }
}
$test = ParamHandler::getInstance( "./params.xml" );
$test->addParam("key1", "val1" );
$test->addParam("key2", "val2" );
$test->addParam("key3", "val3" );
$test->write(); // writing in XML format

$test = ParamHandler::getInstance( "./params.txt" );
$test->read(); // reading in text format

The code is excerpted from “PHP Objects Patters and Practice, Apress, 2010”