Uno può fare la stessa cosa utilizzando strumenti diversi. Così ho negli esempi qui sotto.PHP OOP: interfaccia vs approccio non-interfaccia - esempi
Uno mostra l'uso dell'interfaccia/polimorfismo (fonte: nettuts - Penso). Un'altra interazione di classe diretta (la mia) - che mostra anche qualche polimorfismo (tramite call_tool()).
Mi diresti, quale consideri un modo migliore.
Quale è più sicuro, più stabile, a prova di manomissione, a prova di futuro (lo sviluppo del codice AFA è interessato).
Si prega di esaminare la portata/la visibilità utilizzata in entrambi.
Le vostre raccomandazioni generali, come la migliore pratica di codifica.
INTERFACCIA:
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 INTERFACCIA
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();
codice MikeSW (se ho capito bene)
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);
$ _GET - questo non faceva parte di q. ;), quindi non ho prestato molta attenzione. Nel codice dal vivo sarebbe guardato correttamente da ogni angolazione. Ma hai ragione, non dovrei lasciarlo passare, anche se era fuori q. scopo. – Jeffz
se si rendono private le proprietà poly_base_Article, in che modo ad es. poly_writer_xmlWriter li accede? non esiste alcuna relazione tra di loro – Jeffz
WriterFactory - non si tratta solo di creare oggetti aggiuntivi senza molte funzionalità aggiunte da esso? – Jeffz