Property Hooks a asymetrické v PHP 8.4 – dočká se jich Nette?
- David Grudl
- Nette Core | 8266
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?
- m.brecher
- Generous Backer | 897
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)