# Marcus Olsson Frilansande webbutvecklare

# PHP 8.4

Marcus Olsson, 24 nov 2024

PHP 8.4 (eller t.o.m. 8.4.1) är nu ute med ett par fantastiska nyheter. Har inte möjlighet att gå igenom allt här (spana in [officiella php.net](https://www.php.net/manual/en/migration84.new-features.php) och t.ex. [stitcher.io](https://stitcher.io/blog/new-in-php-84) för mer övergripande nyheter) – men två saker som är väldigt värda att belysa:

## "Without parentheses"

PHP har alltid varit märkligt med att man måste wrappa `new` när man ska kalla på en metod efter att ha instansierat ett objekt:

```
$results = (new Calculator())->calculate();
$results = (new Calculator())->calculate();
```

Jag har stött på andra PHP-utvecklare som inte ens har känt till detta syntax utan verkar ha "lärt" sig att `new Calculator()->calculate()` inte funkar som i andra programmeringsspråk och helt enkelt kört den långa vägen istället (vilket såklart fortfarande kan vara mer passande och läsbart):

```
$calculator = new Calculator();
$results = $results->calculate();
$calculator = new Calculator();
$results = $results->calculate();
```

Men nu i.o.m. PHP 8.4. kan man helt enkelt använda sig av:

```
$results = new Calculator()->calculate();
$results = new Calculator()->calculate();
```

## Property hooks

Property hooks funkar lite som [accessors/"custom attributes" i Laravel](https://laravel.com/docs/11.x/eloquent-mutators#accessors-and-mutators) (gissningsvis kommer de använda property hooks "natively" i framtiden), där vi nu inte längre kommer att behöva skriva separata "getters" och "setters" – utan där vi kan definiera dem direkt för attributen. Exempel (saxat ifrån php.net):

```
class Person
{
    // A "virtual" property.  It may not be set explicitly.
    public string $fullName {
        get => $this->firstName . ' ' . $this->lastName;
    }

// All write operations go through this hook, and the result is what is written.
    // Read access happens normalt.
    public string $firstName {
        set => ucfirst(strtolower($value));
    }

// All write operations go through this hook, which has to write to the backing value itself.
    // Read access happens normalt.
    public string $lastName {
        set {
            if (strlen($value) < 2) {
                throw new \InvalidArgumentException('Too short');
            }
            $this->lastName = $value;
        }
    }
}
```

Lägg där till en rad nya array-funktioner som `array_find` och `array_any`/`array_all` samt nya `mb_`-funktioner (`mb_ucfirst` och `mb_lcfirst` äntligen!) så är PHP 8.4 en riktigt fullpackad uppdatering!
