Property declared dynamically, this is deprecated starting from PHP 8.2
- jedlicka
- Člen | 70
Zdravím,
přecházíme s naší Nette aplikací z Nette 3.1 na Nette 3.2 a z PHP 7.4 na PHP 8.3.
Aplikaci vyvíjíme v prostředí PHPStorm.
A na 8.3 nám PHPStorm hlásí na každém předání
parametrů do šablony:
$this->getTemplate()->counter = $counter
Warning:
Property declared dynamically, this is deprecated starting from PHP 8.2
.
Obrázek viz zde: http://cloud.ic-office.eu/…yEF95L7XcimX
Je to chyba nastavení validací v PHPStormu nebo Nette?
Díky.
Martin
- Lumeriol
- Generous Backer | 63
Problém není ani na straně Nette, ani na straně PHPStormu, ale ve změně přístupu v PHP od verze 8.2, kdy jsou dynamicky vytvářené proměnné označené jako Deprecated, tedy něco, co by se již nemělo používat a časem bude odstraněno.
Více se k tomu dozvíš např. tady.
Primárním cílem je mít dané proměnné otypované a předem známé, aby se v něm nedalo „prasit“ kód tak, jak se to dělávalo dříve zcela běžně.
V Nette to můžeš vyřešit například použitím třídy s parametry.
- m.brecher
- Generous Backer | 871
@jedlicka
V presenterech se injektují proměnné do šablony aniž by se v objektu implementujícím interface Template předem deklarovaly. V PHP 8.3 to způsobí hlášku deprecated, kterou ale lze v odůvodněných případech potlačit tagem #[\AllowDynamicProperties].
Metoda presenteru getTemplate() má return type interface Template a když jsme si to u sebe v presenteru zkoušel vrací ‚Nette\Bridges\ApplicationLatte\DefaultTemplate‘, tuto třídu jsem si vyhledal v src Nette – /vendor/nette/application/src/Bridges/ApplicationLatte/DefaultTemplate a tam atribut #[\AllowDynamicProperties] je. Takže já ten popisovaný problém v instalovaném Nette (poslední verze) nemám.
Asi bude potřeba upgradovat nette/application, protože máš možná nějakou starší verzi
Editoval m.brecher (22. 8. 14:49)
- nightfish
- Člen | 518
m.brecher napsal(a):
Metoda presenteru getTemplate() má return type interface Template
…a interface Template
na sobě samozřejmě
#[\AllowDynamicProperties]
nemá, proto ti PHPStorm hlásí, co
ti hlásí.
@jedlicka
Aplikace jako taková ti fungovat bude, právě proto, že
getTemplate()
ti (obvykle) vrátí instanci třídy
\Nette\Bridges\ApplicationLatte\DefaultTemplate
, která na sobě
#[\AllowDynamicProperties]
zapnuté má.
Pokud se ti to děje v presenteru a máš nějakého společného předka, můžeš si nad třídu zkusit přidat anotaci:
/**
* @method \Nette\Bridges\ApplicationLatte\DefaultTemplate getTemplate()
*/
class BasePresenter extends ...
…která PHPStormu řekne, že metoda getTemplate()
vrací
DefaultTemplate
, na které je vytváření dynamických properties
povoleno.
- nightfish
- Člen | 518
@jedlicka
V tuto chvíli existují tři způsoby, jak se vyhnout deprecation warningu
u dynamických proměnných:
- použít atribut
#[\AllowDynamicProperties]
- použít třídu
\stdClass
nebo ji podědit - implementovat na třídě magický getter (
__get()
) a setter (__set()
)
Nevypadá to, že by pro PHP 9 přestala některá z uvedených možností být podporovaná. Jediné, z čeho se stane fatal error, bude používání dynamických proměnných mimo tyto tři případy.