Autor Zpráva
návštěvník
Profil *
Mám metodu, ve které mám deklarovanou statickou proměnnou, kterou iniciuji jako pole, pak do ní uložím hodnoty a následně když jsem skončil chci hodnoty uspořádat podle klíčů a pak zpřístupnit nebo zkopírovat do $this->words . Nedaří se mi to ale zpřístupnit, tak mě zajímá jak to udělat? Uvnitř metody mám:

    ksort($badwords);
    $this->badwords = $badwords;
    print_r($this->badwords);

Zde je výpis v pořádku. Mimo metodu už výpis ukazuje prázdné pole.
Joker
Profil
návštěvník:
Není tam třeba chyba v názvu atributu, stejně jako v dotazu (words vs badwords)?

Jinak moc nechápu zvolený postup, kdy metoda používá lokální statickou proměnnou a její hodnotu kopíruje do atributu objektu. To může rovnou používat ten atribut, ne?
návštěvník
Profil *
Joker:
Teoreticky ano, ale není lepší mít přehled o tom v jakém stavu je lokální statická proměnná (pole je neuspořádané), kdežto this->words bude už uspořádané? Právě tak jsem to myslel, aby to bylo pro přehlednost, leč zatím nefunkční.


konečně jsem to vyřešil. Muselo to být přes statickou, protože to statické pole se při každém zavolání funkce resetuje. Příklad
$words[$key]='';
for ...// smyčka
$words[$key].= $org[$x];

key při každém volání metody je 0, tak tam musí být statická, jinak by se ty předchozí hodnoty přepsaly. A chyba byla opravdu v názvu, místo this->badwords mělo být this->badWords
Joker
Profil
návštěvník [#3]:
Na to se nedá obecně odpovědět, záleží na situaci.

Jestli hodnota v průběhu výpočtu opravdu nemá být dostupná, byl by alternativou ještě private atribut toho objektu. Přijde mi to i „méně ošklivé“, než statická lokální proměnná, protože tam pro nějaké ladění a podobně je lepší přehled o aktuální hodnotě.

Z teoretického pohledu je ale podezřelý ten princip fungování, kdy na celou operaci je zjevně potřeba více běhů metody, přičemž některé běhy ukládají jakési mezivýsledky do skrytých dat.
To by se nemělo dít, jedno volání jedné metody by mělo provést nějakou jednu definovanou operaci. Ne že si jedno volání něco „rozdělá“ a další v tom pak bude pokračovat.
návštěvník
Profil *
Joker:
Chápu jak to myslíš. Udělal jsem to dost nestandardně. Mám jednu metodu a tu volám postupně v šesti krocích. Každé volání identifikuju číslem větším o jedno .... funkce(args, 1); funkce(args, 2); funkce(args, 3); atd. Asi by bylo správnější vytvořit buď na to samostatnou pod/třídu nebo více metod. Ale takhle tam mám zase ty čísla, která mi vizuálně dávají jistotu, že tu metodu budu volat ve správném pořadí než když bych měl šest metod a zapomněl v jakém pořadí je mám správně volat, když bych se v tom chtěl někdy v budoucnu hrabat. Taky mi připadalo zbytečné dávat sdíleně ty pomocné proměnné, které potřebuju jako static (jinak bych je musel dát do třídy jako private, ale mě nepřijdou až tak významné, abych je strkal do kontextu celé třídy).
Tori
Profil
návštěvník:
funkce(args, 1); funkce(args, 2); funkce(args, 3); atd.
Zajímalo by mě: 1. v args předáváte pokaždé stejná data? 2. děláte s $args nějaké úpravy i mimo / mezi voláními té metody, či ne? Totiž pokud odpovědi jsou „ano“ a „ne“, tak se to dá řešit i jinak a stejně přehledně.
Joker
Profil
návštěvník:
Ten popis mi dost připomíná nějakou variaci na „Loop-switch sequence“, neboli For-case paradigm.

Mají jednotlivé kroky smysl samy o sobě? Lze si pro volání funkce(args, 4) představit i jiné využití, než jako mezikrok mezi funkce(args, 3) a funkce(args, 5) (a analogicky všechna ostatní)?
Jestli odpovědi jsou „ne“, je to špatně navržená metoda.

Je-li nutné vždycky provést jednotlivé kroky v přesném pořadí, jde o tu úplně nejjednodušší programátorskou konstrukci: Sekvenci příkazů.
Pokud je ta sekvence moc dlouhá a některé její části se opakují, identifikujte v ní jednotlivé dílčí činnosti a oddělte je do zvláštních metod.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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

0