Skip to content

Instantly share code, notes, and snippets.

@bz0
Created July 28, 2018 04:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bz0/ffc30b0f3c14a50263f531849916e1a4 to your computer and use it in GitHub Desktop.
Save bz0/ffc30b0f3c14a50263f531849916e1a4 to your computer and use it in GitHub Desktop.
GoF Builderパターンのサンプル
<?php
class News{
private $title;
private $url;
private $target_date;
public function __construct($title, $url, $target_date){
$this->title = $title;
$this->url = $url;
$this->target_date = $target_date;
}
public function getTitle(){
return $this->title;
}
public function getUrl(){
return $this->url;
}
public function getDate(){
return $this->target_date;
}
}
class NewsDirector{
private $builder;
private $url;
public function __construct(NewsBuilder $builder, $url){
$this->builder = $builder;
$this->url = $url;
}
public function getNews(){
$news_list = $this->builder->parse($this->url);
return $news_list;
}
}
interface NewsBuilder {
public function parse($data);
}
class RssNewsBuilder implements NewsBuilder {
public function parse($url){
$data = simplexml_load_file($url);
if ($data === false){
throw new Exception (
'read data[' .
htmlspecialchars($url, ENT_QUOTES, mb_internal_encoding()) .
'] failed !'
);
}
$list = array();
foreach ($data->item as $item){
$dc = $item->children('http://purl.org/dc/elements/1.1/');
$list[] = new News(
$item->title,
$item->link,
$dc->date
);
}
var_dump($list);
return $list;
}
}
//RSSのパース処理クラス
$builder = new RssNewsBuilder();
$url = "http://www.php.net/news.rss";
//RSSのパース処理クラスを実行
$director = new NewsDirector($builder, $url);
//出力処理
foreach($director->getNews() as $article){
printf(
'<li>[%s] <a href="%s">%s</a></li>',
$article->getDate(),
$article->getUrl(),
$article->getTitle()
);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment