PHP függvényben változó átadása (nem global).

PHP függvényben változó átadása (nem global).
2010-09-01T18:00:32+02:00
2010-09-01T20:59:40+02:00
2022-11-19T00:30:44+01:00
Lovi
Üdv mindenkinek.

A problémámat átlátni egyszerű, de nem sikerült rá megoldást találjak sehonnan se. Írni készültem egy függvényt ami kezeli az oldalam témáit, figyelembe véve, hogy be vagyok-e jelentkezve, mobilról nézem-e, html vagy json kimenet kell-e, satöbbi. Viszont már a legelején elakadtam.

function ThemeHandler($layoutfile) { global $ThemeLocation; include "Themes/$ThemeLocation/Layout/$layoutfile"; }

A probléma logikus, az include-dal behívott kód nem látja a többi változót, és értelem szerűen nem tudom mindet globalba tenni, túl sok van. Javaslatokat várok, hogyan kerüljem meg a problémát, a függvény elhagyása nélkül.

Előre is köszönöm a válaszokat!
Üdv: Szabolcs.
Mutasd a teljes hozzászólást!
Egyébként miért ragaszkodsz ennyire a függvényhez? Ha elhagynád, és helyette egy feltétel-vizsgálat után include-olnál, megoldódna minden gond.
Ha több helyről kell hívni, és ezért akarsz függvényt használni, akkor pedig lehetne egy külön php állományban a
"Themes/$ThemeLocation/Layout/$layoutfile"
file-t include-oló rész (de függvény nélkül), ezt az említett állományt pedig megint csak include húzná be a főoldalba.
Mutasd a teljes hozzászólást!

  • Esetleg session-t használni, és abban tárolni a változókat?
    Más módszer nem nagyon jut eszembe.
    Mutasd a teljes hozzászólást!
  • az include-dal behívott kód nem látja a többi változót


    Az indlude-al meghívott kód látja. A függvényen belül nem látszik.

    Javaslatokat várok, hogyan kerüljem meg a problémát


    Nem egyedi változókat használsz, hanem egy tömböt, és azt a
    global $tomb;
    után máris használhatod.

    Vagy persze felsorolhatod a függvény meghivásakor.

    Vagy berakhatod azokat session (tömbbe ) és azt látod a függvényben.
    Mutasd a teljes hozzászólást!
  • Micu és Interlock válasza is hasonló, mint írtam túl sok a változó. Igazából nem is túl sok, hanem irdatlanul sok, az átláthatóság érdekében nem fogom mindet egy tömbbe tenni, valami mást kell kitalálni :S

    Micunak pedig köszönöm a javítást, bár nem általánosan értettem így, hanem a saját kódomra nézve (hiszen ott az include egy függvényen belül van, EMIATT "az include-dal behívott kód nem látja a többi változót").
    Mutasd a teljes hozzászólást!
  • hiszen ott az include egy függvényen belül van


    Inkább az include-ban van a függvény
    Mutasd a teljes hozzászólást!
  • Huh most rendesen megkavartál.
    Amit beírtam ott az include van a függvényen belül.
    De egyébként Ez a függvény is egy includeon belül van, és amit a behívott függvényen belül behívok, abban is vannak függvények. Bár ez most irreleváns :D

    Témához visszatérve, te hogyan kerülnéd meg ezt a gondot? Ha már tömbökkel kókányolunk, azt is lehet, hogy a függvény egy tömböt ad vissza, és abban vannak az include változói, amit majd a függvény után hívok meg, nem-pedig benne. Akkor az eredeti problémára semmi ötlet?
    Mutasd a teljes hozzászólást!
  • A függvényben includolt rész azt látja, amit a függvény. (kivétel, ha abban is van egy függvény, mert akkor az include-ba lévő függvény már megint saját "hatókörrel" rendelkezik.)

    A függvény visszaadhat egy tömböt, amit felhasználjatsz.

    --
    Ebben az esetben én inkább egy class-ban gondolkodnék. Kicsit könnyebb átadni (az összes "értékével" együtt).
    Mutasd a teljes hozzászólást!
  • Egyébként miért ragaszkodsz ennyire a függvényhez? Ha elhagynád, és helyette egy feltétel-vizsgálat után include-olnál, megoldódna minden gond.
    Ha több helyről kell hívni, és ezért akarsz függvényt használni, akkor pedig lehetne egy külön php állományban a
    "Themes/$ThemeLocation/Layout/$layoutfile"
    file-t include-oló rész (de függvény nélkül), ezt az említett állományt pedig megint csak include húzná be a főoldalba.
    Mutasd a teljes hozzászólást!

  • include "Themes/".$ThemeLocation."/Layout/".$layoutfile;
    Mutasd a teljes hozzászólást!
  • Mi a kérdés?
    A probléma logikus, az include-dal behívott kód nem látja a többi változót, és értelem szerűen nem tudom mindet globalba tenni, túl sok van. Javaslatokat várok, hogyan kerüljem meg a problémát


    A te kódod megoldja?
    Mutasd a teljes hozzászólást!
  • function ThemeHandler($layoutfile) { foreach ($GLOBALS as $key => $value) ${$key} = $value; include "Themes/$ThemeLocation/Layout/$layoutfile"; }

    mondjuk érdemes a $key és $value változókat inkább valami nagyon hosszú random karaktersorra lecserélni, mert ilyen, hogy $key meg $value simán lehet máshol is.
    Mutasd a teljes hozzászólást!
  • Na eddig Interlock 2. válasz a legszimpatikusabb, ha nem jut jobb eszembe, akkor ezt fogom használni. Mindenkinek köszönöm a válaszokat, főleg Interlocknak és Micunak. Megadom a pontot.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd