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.