Kontynuujemy przygodę w kierunku poznawania OOP w języku PHP. Tym razem piszemy klasę mającą reprezentować classlist, czyli listę klas CSS elementu HTML. Do dzieła.

Zaczynamy od utworzenia klasy, pola (będącego tablicą) oraz metody add:

<?php 
class ClassList {
    public $classlist = array();

    public function add($item){
        $this->classlist[] = $item;
        return $this;
    }
}
$cls = new ClassList();
$cls->add("btn")->add("btn-danger");
print_r($cls->classlist);

W pierwszej linijce metody add wykonujemy tak naprawdę array_push za pomocą składni z [], w drugiej zwracamy this, czyli umożliwiamy chainowanie metod na sobie.

Teraz metoda remove:

<?php 
class ClassList {
    public $classlist = array();

    //(...)
    public function remove($item){
        $this->classlist = array_filter($this->classlist, function($el) use ($item) {
            return $el !== $item;
        });
        return $this;
    }
}

Tak samo fluent, czyli zwraca this, można chainować. Zastosowano array_filter, z callbackiem, któremu trzeba wskazać przez słówko kluczowe use, że ma dostęp do zmiennej item w ramach domknięcia (closure).

Zwracamy odfiltrowaną tablicę bez tego elementu, który usunąć kazaliśmy. Kolejna metoda:

<?php 
class ClassList {
    public $classlist = array();

    //(...)

    public function has($item){
        return in_array($item, $this->classlist);
    }

    public function toggle($item){
        if($this->has($item)){
            $this->remove($item);
        } else {
            $this->add($item);
        }
        return $this;
    }

}

Metoda has jest prosta, zaś toggle – w sumie też. Ciekawa o tyle (toggle), że używa własnej metody has, do której odwołuje się poprzez this. Klasę dodaje lub usuwa, jeżeli już jest – słowem toggle.

Następne metody:

<?php 
class ClassList {
    public $classlist = array();

    //(...)

    public function output(){
        return '"' . implode(" ", $this->classlist) . '"';
    }

    public function empty(){
        return count($this->classlist) === 0;
    }
}

Empty bardzo proste, aż nie ma co komentować. Output – zwraca wewnątrz cudzysłowu HTMLowego (podwójny) klasy oddzielone spacją.

Można teraz naszą klasę wypróbować:

<?php 
class ClassList {
    //(...)
}

$cls = new ClassList();
$cls->add("btn");
$cls->add("btn-danger");
$cls->toggle("btn");
$cls->toggle("hide");
$cls->add("d-flex");
echo $cls->output();
var_dump($cls->empty());