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 #