S vydaním PHP8.4 som sa pokúšal experimentovať s funkciami, ktoré poskytuje. Jednou takou funkciou je podpora vlastností v rozhraniach. Rozhrania sa časom trochu vylepšovali, ale až do PHP8.3 boli povolené len metódy, pričom vlastnosti z definície chýbali.
Chcejúc využiť túto novú funkciu som šiel a vytvoril rozhranie s vlastnosťou, očakávajúc, že všetko prebehne hladko:
<?php
interface MyInterface
{
public string $property;
}
Na moje prekvapenie výsledkom bola chyba:
PHP Fatal error: Interfaces may only include hooked properties
Prehľadávaním som po nejakom čase zistil, čo bolo nesprávne.
Hooked properties #
Vlastnosti na rozhraniach sú teraz skutočne dostupné, ale s malým háčikom. Funkcia vyžaduje novú jazykovú syntax:
<?php
interface MyInterface
{
public string $readWriteProperty { get; set; }
public string $readOnlyProperty { get; }
public string $writeOnlyProperty { set; }
}
Je povinné explicitne uviesť, či je vlastnosť len na čítanie cez
{ get; }, len na zápis cez { set; }, alebo — čo bolo pre mňa
najproblematickejšie nájsť odpoveď, a tiež čo som skutočne hľadal — či je
vlastnosť na čítanie aj zápis cez { get; set; }.
V čase písania sa trochu hanbím, pretože oficiálna PHP dokumentácia na túto tému má syntax jasne načrtnutú, ale nejako som ju prehliadol.
Doslov #
Pre mňa to stále pôsobí trochu zvláštne, že príkaz obsahujúci háky
vlastností nemusí končiť bodkočiarkou ;, ale ako vedľajšia poznámka, od
PHP8.0 sme v jazyku dostali niekoľko nových konštruktov, napríklad vo forme
výrazu match:
<?php
$animal = 'dog';
$value = match ($animal) {
'cat' => 'This animal is a cat',
'dog' => 'This animal is a dog',
'mouse' => 'This animal is a mouse',
};
Bodkočiarka vo vyššie uvedenom príklade je skutočne na konci príkazu, ale hneď za kučeravou závorkou. Takáto syntax v jazyku nebola v PHP7.4 ani nižšom, aspoň podľa mojich vedomostí. Tiež pribúdajú stále nové zmeny a funkcie, čo je pre PHP svet skvelá vec.
Dúfajme, že keď sem pristanete hľadaním chyby, teraz budete vedieť, ako postupovať. Ak nie, tu je pravdepodobne to, čo hľadáte:
interface MyInterface
{
- public string $property;
+ public string $property { get; set; }
}
Príjemnú prácu!
Odkazy #
- https://laravel-news.com/php-8-4-0#content-php-property-hooks
- https://laravel-news.com/php-property-hooks
- https://stitcher.io/blog/new-in-php-84#property-hooks-rfc
- https://www.php.net/manual/en/control-structures.match.php
- https://www.php.net/manual/en/language.oop5.interfaces.php#language.oop5.interfaces.properties
- https://ashallendesign.co.uk/blog/php-84-property-hooks#content-read-only-hooked-properties