PHP OOP: interface versus non-interface approach - examples

You can do the same thing using different tools. Therefore, I will give examples.

One shows the use of an interface / polymorphism (source: nettuts - I think). Another direct class interaction (mine), which also shows some polymorphism (via call_tool ()).

Could you tell me what you would consider the best way.

Which is safer, more stable, resistant to unauthorized, future proof (development of afa code).

View the scope used in both.

Your general recommendations that are best for coding.

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 ( )

 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);
+5
2

, , . -, poly_base_Article , , , -, .

$_GET.

 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 getTitle() { return $this->title;}
 //...other getters defined here...

   public function AsArray()
     { 
          return (array) $this;
     }

//this could be removed
public function write(poly_writer_Writer $writer) {
    return $writer->write($this);
}
}

, , , .

* call_tool * factory poly_writer_Writer (, - ), -

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);

, , , ( afa).

. , , , : P

, poly_base_Article, . , , ( ), , ( ).

WriterFactory factory, - , . , . , $. $ , , , . , WriterFactory, true/false , .

, fad... , . , - "" . : , - .

, , -, , , , , , 2 . SRP ( ).

, factory , , , , PHP . , , ( ). , .

, #, , , , (# , , PHP, , , , )

+2

, .

, :

  • .

, . .

.

+1

All Articles