PHP 8.1: Readonly properties (vlastnosti)

PHP

POZOR! Článek jsem napsal před více jak rokem, a tudíž už nemusí reflektovat můj nynější názor nebo může být zastaralý.

Další skvělou novinkou, kterou PHP 8.1 přináší jsou „readonly properties“. Tedy vlastnosti objektu, kterou jsou pevně nastavené v konstruktoru a jsou pouze pro čtení.

Aktuálně u objektu šlo něco podobného vytvořit pomocí magické funkce __get().

Uvedu zde jaké byly možnosti vlastností od PHP 7.0, 7.4, 8.0 až po nové (budoucí) 8.1.

PHP < 7.4

<?php

class Uzivatel {
    /** @var string */
    public $jmeno = '';

    
    public function __construct(
        string $jmeno
    ) {
        $this->jmeno = $jmeno;
    }

    public function __set($name, $value) {
        if ($name === "jmeno") {
            throw new \Exception("Vlastnost 'jmeno' je pouze pro čtení");
        }
    }
}

PHP >= 7.4

V PHP 7.4 bylo možné definovat typ přímo u vlastnosti – už nebyl potřeba dokumentační komentář:

<?php

class Uzivatel {
    public string $jmeno = '';

    
    public function __construct(
        string $jmeno
    ) {
        $this->jmeno = $jmeno;
    }

    public function __set($name, $value) {
        if ($name === "jmeno") {
            throw new \Exception("Vlastnost 'jmeno' je pouze pro čtení");
        }
    }
}

PHP >= 8.0

V PHP 8.0 je již možnosti definovat vlastnosti přímo v parametrech konstruktoru:

<?php

class Uzivatel {
    public function __construct(
        public string $jmeno = ''
    ) {}

    public function __set($name, $value) {
        if ($name === "jmeno") {
            throw new \Exception("Vlastnost 'jmeno' je pouze pro čtení");
        }
    }
}

PHP >= 8.1

Nakonec v PHP 8.1 lze zápis zkrátit takto:

<?php

class Uzivatel {
    public function __construct(
        public readonly string $jmeno = ''
    ) {}
}

Znáte někoho, komu by článek mohl pomoct? Zasdílejte mu ho :)

Komentáře