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.