Autor Zpráva
midlan
Profil
Ahoj,
neví někdo jestli je v php nějak možné převést anonymní funkci na normální? Aby funkce v proměnné šla poté zavolat klasicky přes fce();. Potřebuji to, protože funcki bych rád při vytvoření předal nějakou proměnnou z vnějšího prostředí pomocí use.
Jan Tvrdík
Profil
Nějaký konkrétní příklad by nebyl? Možná hledáš __invoke, možná create_function. Těžko říct.
midlan
Profil
Jan Tvrdík:
Chci předat objekt, se kterým by mohla pracovat při každém volání. Konrétně bych chtěl udělat "zkratku" pro volání metody onoho objektu, takže bych potřeboval něco jako:
function fce($param) use ($object) {
  return $object->method($param);
}
Jan Tvrdík
Profil
midlan:
Pokud to dobře chápu, tak si vyrábíte chybu v návrhu. Řešení může vypadat třeba takto.

$GLOBALS['object'] = $object; // globální registr, fuj
function fce($param)
{
    return $GLOBALS['object']->method($param);
}

Nepoužívejte to, děkuji.
midlan
Profil
Jan Tvrdík:
Ano přesně tohle potřebuji, $object proměnná je v globálním prostředí, takže až na první řádku je to to "správně". Schválně to píšu v uvozovkách, protože pole $GLOBALS nikde nepoužívám. Jinak to vyřešit nejde?
Jan Tvrdík
Profil
midlan:
Obecně platí, že všechno globální (tj. i statické) je z pohledu návrhu zlo, které na určitých místech tolerujeme (třeba proto, že to v daném jazyku nelze vyřešit neglobálně), ale to nic nemění na tom, že to není dobré.

Takže mít jakoukoliv proměnnou v globálním prostředí je špatně. Stejně tak je špatně mít funkci, který natvrdo závisí na nějaké globální proměnné. Správné „neglobální“ řešení (pominu-li to, že dost možná je blbost už samotný problém, který řešíš) by mohlo vypadat třeba takto:

function createFce($object)
{
    return function ($param) use ($object) {
        return $object->method($param);
    };
}

Tedy máš továrničku na tu funkci, která vrátí tu funkci zafixovanou na daný objekt. Na tobě je pak zajistit, že vytvořená funkce je korektně předána všem, kdo ji potřebují (např. pomocí dependency injection).
midlan
Profil
Jan Tvrdík:
Obecně platí, že všechno globální (tj. i statické) je z pohledu návrhu zlo, které na určitých místech tolerujeme (třeba proto, že to v daném jazyku nelze vyřešit neglobálně), ale to nic nemění na tom, že to není dobré.
Tohle moc nechápu, já mám v globálním prostředí v podstatě jen objekty a ty pak předávám tam, kde jsou potřeba (dependency injection), nevím co je na tom špatného.

Jan Tvrdík:
dost možná je blbost už samotný problém, který řešíš
Teď nad tím přemýšlím a máš pravdu. Mělo se jednat o zkratku, na vytvoření přkládací funkce t() (šlo o ten ultrakrátký zápis), ale tu už vlastně skoro nikde nepoužívám, protože vše řeší můj šablonovací systém a ten akceptuje pro překládání callbacky takže to nebude problém. Omlouvám se za zmařený čas.
peta
Profil
Kdybych byl hacker, tak si necham zobrazit celou tvou globalni promennou. Cili, hesla k mysql, hesla k ftp, hesla uzivatele a ja nevim, co vechno tam jeste mas. Tez snadno pak zmenis nastaveni. Treba mas promennou prava, ktera urcuje, co uzivatel muze a nemuze. tak se prihlasis jako bezny uzivatel, zmenis si prava a razem na to nejaka funkce zareaguje tak, ze zobrazi vse, co adminovi.
Podle meho je idealni to hnedka nasoukat do objektu a zabezpecit, tusim, pres private.
midlan
Profil
peta:
Kdybych byl hacker, tak si necham zobrazit celou tvou globalni promennou. Cili, hesla k mysql, hesla k ftp, hesla uzivatele a ja nevim, co vechno tam jeste mas.
Bohužel pro heckara, nic takového tam nemám. Jsou tam jen zapouzdřené objekty. Po přeroutování url se skripty, na které ukazuje routovaná url, spouští v anonymní funkci, takže také nic nezapíší do globálního prostředí.
Jan Tvrdík
Profil
peta:
Podle meho je idealni to hnedka nasoukat do objektu a zabezpecit, tusim, pres private.
Nešiř bludy peta. Účel private rozhodně není zabezpečit cokoliv před hackery.
shaggy
Profil
peta:
Kdybych byl hacker, tak si necham zobrazit celou tvou globalni promennou.
Ako? To môžeš rovno napísať, že keby si bol hacker, tak si necháš na akomkoľvek webe zobraziť prihlasovacie údaje do db (keď sa vieš dostať ku globálny premenným, budeš sa vedieť dostať k akýmkoľvek).
peta
Profil
shaggy: Dyt jo. Jde mi spis o to, ze se normalne pojmenovavaji glovalni promenne jako config, cfg. Pak mit v php diru treba pres vstupni promenne takovou ($_POST, $_GET), ze staci do ni pridat prikaz print_r($CONFIG). Dalsi operace uz pak provadim legalne pod prihlasovacimi udaji admina webovymi nastroji jako phpmyadmin, ftp.
midlan
Profil
peta:
($_POST, $_GET), ze staci do ni pridat prikaz print_r($CONFIG)

Opravdu máš někde něco jako eval($_POST['whatever'])? Potom by bylo úplně jedno co máš v globálním prostředí.

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: