Autor Zpráva
Monkeys
Profil *
Zdravim

da sa z instancie triedy nastavit nova hodnota konstanty?

napr.

class a {

const PATH = "../cesta/cesta/";
}

$a = new a();
$a::PATH = "../nova/cesta/"; // toto nefunguje

dik
M.
tiso
Profil
nie
Keeehi
Profil
Monkeys:
Nejde o to, zda je to uvnitř nebo vně nebo úplně bez vztahu k třídě. Konstanta nejde nikdy změnit, protože vždy zůstává neměnná, konstantní.

Možná by to šlo změnit vytvořením nové třídy která od a dědí. Tak to otestuj.
Alphard
Profil
Keeehi:
Nejde o to, zda je to uvnitř nebo vně nebo úplně bez vztahu k třídě
To není úplně pravda, konstanty definované pomocí define() se vytvářejí až v run-time fázi a pomocí runkit_constant_redefine() je lze změnit (ne že by byl dobrý nápad je měnit). Třídní konstanty jsou nastaveny před run-time fází a jejich změna není možná (kvůli tomu také není možné vyhodnotit do nich výrazy, jak se někdo občas snaží).

Monkeys:
Čeho chcete dosáhnout? Uměl bych si představit snahu nastavit něco v konstruktoru a pak dál nepovolit žádné změny, ale definovat si konstantu a chtít ji změnit jako public vlastnost (jak je naznačeno v [#1]) se mi zdá zvláštní.
Monkeys
Profil *
Alphard:

Mam class na generovanie formularov a na zaciatku triedy mam zadefinovanu absolutnu cestu k obrazkom pomocou const. Napr. koli formularovemu prvku input image.
Triedu Form teraz volam z inej triedy v ktorej nie je dostupna absolutna cesta a vyhadzuje mi to chybu. Tak som chcel konstantu definovat ako NULL. Trochu som nedomyslel tu strukturu. Budem to musiet prerobit na public premennu a bude to OK.
Keeehi
Profil
Monkeys:
Budem to musiet prerobit na public premennu a bude to OK.
Než public proměnnou by bylo hezčí použít private nebo protected a setter. Nebo ještě lépe jak už psal Alphard nastavení provést v konstruktoru.

Alphard:
To jsem nevěděl avšak pro zachování jednoduchosti bych to stejně neřekl.
Alphard
Profil
Kromě již řečeného, doporučuji nikde v kódu pevně nepsat cesty, vše řešit přes konfiguraci. Nutné závislosti předávat ideálně v konstruktoru, volitelné přes settery.
Protože pak se stane, že chcete část tříd použít v novém projektu, který je ale potřeba trochu přeskládat. Začnete tedy přepisovat zdrojáky, vzniknou vám dvě verze zdrojových kódů, za týden budete řešit bugfixy, přenášet je mezi verzemi a to je cesta do pekla.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0