One can accomplish same thing using different tools. So have I in examples below.
One shows use of interface/polymorphism (source: nettuts - I think). Another straightforward class interactions (mine) - which shows some polymorphism as well (via call_tool()).
Would you tell me, which would you consider to be a better way.
Which is safer, more stable, tamper resistant, future proof (afa code development is concerned).
Please scrutinise scope/visibility used in both.
Your general recommendations, as which is best coding practice.
INTERFACE:
class poly_base_Article {
public $title;
public $author;
public $date;
public $category;
public function __construct($title, $author, $date, $category = 0, $type = 'json') {
$this->title = $title;
$this->author = $author;
$this->date = $date;
$this->category = $category;
$this->type = $type;
}
public function call_tool() {
$class = 'poly_writer_' . $this->type . 'Writer';
if (class_exists($class)) {
return new $class;
} else {
throw new Exception("unsupported format: " . $this->type);
}
}
public function write(poly_writer_Writer $writer) {
return $writer->write($this);
}
}
interface poly_writer_Writer {
public function write(poly_base_Article $obj);
}
class poly_writer_xmlWriter implements poly_writer_Writer {
public function write(poly_base_Article $obj) {
$ret = '';
$ret .= '' . $obj->title . '';
$ret .= '' . $obj->author . '';
$ret .= '' . $obj->date . '';
$ret .= '' . $obj->category . '';
$ret .= '';
return $ret;
}
}
class poly_writer_jsonWriter implements poly_writer_Writer {
public function write(poly_base_Article $obj) {
$array = array('article' => $obj);
return json_encode($array);
}
}
$article = new poly_base_Article('Polymorphism', 'Steve', time(), 0, $_GET['format']);
echo $article->write($article->call_tool());
NON-INTERFACE
class npoly_base_Article {
public $title;
public $author;
public $date;
public $category;
public function __construct($title, $author, $date, $category = 0, $type = 'json') {
$this->title = $title;
$this->author = $author;
$this->date = $date;
$this->category = $category;
$this->type = $type; //encoding type - default:json
}
public function call_tool() {
//call tool function if exist
$class = 'npoly_writer_' . $this->type . 'Writer';
if (class_exists($class)) {
$cls = new $class;
return $cls->write($this);
} else {
throw new Exception("unsupported format: " . $this->type);
}
}
}
class npoly_writer_jsonWriter {
public function write(npoly_base_Article $obj) {
$array = array('article' => $obj);
return json_encode($array);
}
}
class npoly_writer_xmlWriter {
public function write(poly_base_Article $obj) {
$ret = '';
$ret .= '' . $obj->title . '';
$ret .= '' . $obj->author . '';
$ret .= '' . $obj->date . '';
$ret .= '' . $obj->category . '';
$ret .= '';
return $ret;
}
}
$article = new npoly_base_Article('nPolymorphism', 'Steve', time(), 0, $_GET['format']);
echo$article->call_tool();
MikeSW code (if I get it right)
class poly_base_Article {
private $title;
private $author;
private $date;
private $category;
public function __construct($title, $author, $date, $category = 0) {
$this->title = $title;
$this->author = $author;
$this->date = $date;
$this->category = $category;
}
public function setTitle($title) {
return $this->title = $title;
}
public function getTitle() {
return $this->title;
}
public function getAuthor() {
return $this->author;
}
public function getDate() {
return $this->date;
}
public function getCategory() {
return $this->category;
}
}
interface poly_writer_Writer {
public function write(poly_base_Article $obj);
}
class poly_writer_xmlWriter implements poly_writer_Writer {
public function write(poly_base_Article $obj) {
$ret = '';
$ret .= '' . $obj->getTitle() . '';
$ret .= '' . $obj->getAuthor() . '';
$ret .= '' . $obj->getDate() . '';
$ret .= '' . $obj->getCategory() . '';
$ret .= '';
return $ret;
}
}
class poly_writer_jsonWriter implements poly_writer_Writer {
public function write(poly_base_Article $obj) {
//array replacement
//$obj_array = array('title' => $obj->getTitle(), 'author' => $obj->getAuthor(), 'date' => $obj->getDate(), 'category' => $obj->getCategory());
//$array = array('article' => $obj_array);
$array = array('article' => $obj); //$obj arrives empty
return json_encode($array);
}
}
class WriterFactory {
public static function GetWriter($type='json') {
switch ($type) {
case 'json':
case 'xml': $class = 'poly_writer_' . $type . 'Writer';
return new $class;
break;
default: throw new Exception("unsupported format: " . $type);
}
}
}
$article = new poly_base_Article('nPolymorphism', 'Steve', time(), 0);
$writer=WriterFactory::GetWriter($_GET['format']);
echo $writer->write($article);