Uczymy się, czym w PHPowym OOP są traits i jak ich używać. Rozbudowujemy klasę parser o jej nowy trait. Do dzieła.
Najpierw przypomnijmy sobie klasę parser:
class DomDocumentParser {
private $doc;
public function __construct($url) {
$options = array(
'http'=>array('method'=>"GET", 'header'=>"User-Agent: scraperBot/0.1\n")
);
$context = stream_context_create($options);
$this->doc = new DomDocument();
@$this->doc->loadHTML(file_get_contents($url, false, $context));
}
public function getTags($tag) {
return $this->doc->getElementsByTagName($tag);
}
public function showTags($tag){
$iter = $this->getTags($tag)->getIterator();
foreach($iter as $element){
echo $element->textContent;
echo "</br>";
}
}
public function getTagsWithClass($tag, $class){
$tags = $this->doc->getElementsByTagName($tag)->getIterator();
$tagsWithClass = array();
foreach($tags as $tag){
if(stripos($tag->getAttribute('class'), $class) !== false){
$tagsWithClass[] = $tag;
}
}
return $tagsWithClass;
}
public function getById($elem_id){
return $this->doc->getElementById($elem_id);
}
}
Chcemy trait, który zaciągnie wszystkie linki (korzystając z metody klasy Parser) i wyświetli je w formie tabeli.
Piszemy go:
trait ShowLinks {
public function showLinks(){
$links = $this->getTags("a")->getIterator();
echo "<table><tr><th>Title</th><th>URL</th></tr>";
foreach($links as $link){
echo "<tr>";
echo "<td>{$link->textContent}</td>";
echo "<td>{$link->getAttribute('href')}</td>";
echo "</tr>";
}
echo "</table>";
}
}
Jak widać nie ma w tym nic trudnego. Przez this odwołujemy się do metody klasy. Reszta to też nic, czego byśmy wcześniej nie widzieli.
Teraz pozostaje dołączyć trait do klasy oraz go użyć:
trait ShowLinks {
//(...)
}
class DomDocumentParser {
use ShowLinks;
private $doc;
//(...)
}
$parser = new DomDocumentParser("https:/JAKIŚ-URL");
$parser->showLinks();
?>
Nic trudnego. Z traits będziemy jeszcze często korzystać w przyszłości.