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