Property declared dynamically, this is deprecated starting from PHP 8.2

jedlicka
Člen | 70
+
0
-

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 | 62
+
0
-

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 | 863
+
0
-

@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 | 516
+
+2
-

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.

jedlicka
Člen | 70
+
0
-

Moc děkuju všem za rady.

@nightfish A co se stane u PHP 9, kde to už bude fatal error? Ta anotace bude fungovat i tam?

nightfish
Člen | 516
+
0
-

@jedlicka
V tuto chvíli existují tři způsoby, jak se vyhnout deprecation warningu u dynamických proměnných:

  1. použít atribut #[\AllowDynamicProperties]
  2. použít třídu \stdClass nebo ji podědit
  3. 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.