Property Hooks a asymetrické v PHP 8.4 – dočká se jich Nette?

David Grudl
Nette Core | 8253
+
+7
-

Na blogu jsem publikoval hodně obsáhlý článek o novinkách v PHP 8.4, konkrétně o property hooks a asymetrické viditelnosti. Jde o opravdu zásadní změny v objektově orientovaném programování v PHP, které by mohly výrazně ovlivnit náš přístup k návrhu tříd.

Článek zmiňuje i to, že začlenit properties do zajetých projektů, které používají settery a gettery, vytváří dilema. Jak vidíte možnosti začlenění properties do Nette? Kde by mohly property přinést zjednodušení našeho kódu?

Infanticide0
Člen | 112
+
0
-

Co přesunout validace persistentních parametrů z loadState do setterů?

m.brecher
Generous Backer | 889
+
0
-

Ahoj,

v repozitáři nette/application jsem zaznamenal @property-deprecated u třídy Presenter

Anotace aktuální verze:

/**
 * @property-read Nette\Application\Request $request
 * @property-read string $action
 * @property      string $view
 * @property      string|bool $layout
 * @property-read \stdClass $payload
 * @property-read Nette\Http\Session $session
 * @property-read Nette\Security\User $user
 */
abstract class Presenter extends Control implements Application\IPresenter
{....}

anotace na Githubu:

/**
 * @property-deprecated Nette\Application\Request $request
 * @property-deprecated string $action
 * @property-deprecated      string $view
 * @property-deprecated      string|bool $layout
 * @property-read \stdClass $payload
 * @property-deprecated Nette\Http\Session $session
 * @property-deprecated Nette\Security\User $user
 */
abstract class Presenter extends Control implements Application\IPresenter
{...}

Zřejmě se plánuje před přechodem Nette na PHP 8.4 varovat před použitím magických public properties, které se s přechodem Nette na PHP 8.4 odstraněním traity SmartObject znefunkční. Nasadit property hooks do frameworku je dilema a mělo by být komunitou diskutováno. Já property hooks používám v presenterech tímto způsobem:

abstract class AbstractPresenter extends Presenter
{
    public string $name {
        get { return $this->getName(); }
    }

    public string $action {
        get { return $this->getAction(); }
    }

    public AbstractPresenter|Presenter $presenter {
        get { return $this->getPresenter(); }
    }

   // ...

V třídě AbstractPresenter přepíšu privátní property na public property pomocí property hooks a tím vyřadím z činnosti magické __get() které používá traita SmartObject. Pokud se traita SmartObject z frameworku jednou odstraní a properties třídy Presenter zůstanou privátní, tyto definice property hooks budou fungovat bez problémů dál.

Jak by se měly property hooks implementovat v budoucí verzi Presenter class? Určitě by se měly zachovat gettery, vývojáři properties moc nepoužívají, přepisovat staré projekty nedává smysl.

Jak naložit s magickými public properties? Označit je @property-deprecated a později úplně odstranit a kdo chce tak si public properties definuje pomocí property hooks sám v abstraktním předku, nebo je implementovat již do samotného frameworku ??

PHP 8.4 otevírá nové možnosti, pojďme je využít a diskutujme o nejlepším způsobu definice public properties ;)

Editoval m.brecher (21. 3. 1:51)