Próbujemy utworzyć coś na kształt funkcji z JS zwracającej literał obiektu. W PHP tego nie mamy, ale od pewnego czasu mamy klasy anonimowe. Do dzieła.
Cóż, rzućmy okiem na to, co chcemy osiągnąć (przykład z JS):
function createCounter(){
let num = 0;
return {
get() {
return num;
},
increment(){
return ++num;
},
decrement(){
return --num;
}
}
}
Czy w PHP można mieć literały obiektów? I tak, i nie i koniec końców tak:
- Tak, można rzutować do (object) tablicę asocjacyjną z kluczami-stringami i wartościami skalarnymi
- Nie, funkcji (z działającym bindingiem to this) oraz wartości złożonych (tablice, tablice asocjacyjne) poprawnie nie da się rzutować do object
- Tak, można samemu napisać klasę ObjectLiteral, co niedługo zrobimy.
Ok, ale najpierw postaramy się poznać klasy anonimowe. Oto wszystko, czego potrzebujemy:
<?php
function createCounter() {
return new class {
private $num = 0;
public function increment(){
return ++$this->num;
}
public function get(){
return $this->num;
}
};
}
$counter1 = createCounter();
$counter1->increment();
$counter1->increment();
$counter1->increment();
echo $counter1->get() . "<br>"; //3
$counter2 = createCounter();
echo $counter2->get(); //0
Zauważmy, że migracje w Laravelu są klasami anonimowymi. Te klasy czasami się przydają, np. utworzyć obiekt w stylu JS z metodami i działającym this w locie można w ten sposób.