小实验 – 直接调用抽象方法内的静态方法来实例化子类

<?php

abstract class ParamHandler{
	protected $source;
	protected $params = array();

	function __construct($source){
		$this->source = $source;
	}

	function addParam($key, $val){
		$this->params[$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 read(){
		echo 'XmlParamHandler Read.';
	}

	function write(){
		echo 'XmlParamHandler Write.';
	}
}

class TextParamHandler extends ParamHandler{
	function read(){
		echo 'TextParamHandler Read.';
	}

	function write(){
		echo 'TextParamHandler Write.';
	}
}

//抽象方法不能直接实例化,直接调用抽象方法内的静态方法来实例化子类
//这样也行 尼玛......
$test = ParamHandler::getInstance("./params.xml");
$test->addParam("key1","value1");
$test->addParam("key2","value2");
$test->addParam("key3","value3");
$test->write();
?>