Autor Zpráva
Hologos
Profil
Zdravím,
mám třídu, která mi zajišťuje načítání souborů, a pokud je nenajde, vyhodí mi vyjímku atd.
Mám teďka problém s kontextem.

page.php
<?php
var_dump(isset($a));
?>


index.php
<?php
.....
$a = TRUE;
include './page.php'; // var_dump -> TRUE
Loader::loadFile('./page.php'); // var_dump -> FALSE
.....
?>

Dá se to nějak obejít, nebo si budu muset kontext předávat jako 2. parametr? Byl jsem zvyklí, že kontext vidím, teďka musím přepisovat hromadu kódu.
Jak se tohle řeší ve frameworcích (existuje nějaké elegantní řešení)?
Joker
Profil
Hologos:
Nestačila by na tohle autoload funkčnost, která už je součástí PHP?

Jinak to popsané chování (že prostě include se provede v kontextu ve kterém je ten příkaz) je celkem logické a obejít ho půjde těžko.
Hologos
Profil
Pokud se nemýlím, tak autoload zajišťuje načítání tříd, ale to já nepotřebuju. Já potřebuji, ab v souboru page.php byla vidět proměnná $a jako kdybych použil normální include.
Joker
Profil
Hologos:
Nejen to, stejný problém bude i v opačném směru: Činnost toho vloženého kódu se taky projeví na kontextu metody loadFile, takže pokud třeba definuje funkci, bude tato dostupná jen uvnitř metody loadFile.
Hologos
Profil
Joker:
To už mi nevadí. Potřebuji jen proměnné, které budou v šabloně. Nechce se mi kvůli tomu dělat statická třída a přes tu se dotazovat.
Tori
Profil
Čistě ze zvědavosti: pokud bych měla neobjektovou aplikaci, skládanou ze souborů, které chci nějakým automatizovaným způsobem volat (třeba z routeru), byla by velká prasárna použít tohle?
function loadFile($name)  {
  if (!is_file($name) && !is_readable($name)) {
    throw new InvalidArgumentException("Soubor $name neexistuje nebo je necitelny.");
  }
  extract($GLOBALS);
  include $name;
  return (!isset($return) ? $return : null);
}
Majkl578
Profil
[#6] Tori:
Podmínka na 2. řádku je špatně, mělo by tam být OR místo AND.
Nechat funkci tahat věci z globálního prostoru je špatně, mnohem akceptovatelnější by bylo data regulérně předat parametrem. Funkce pak nic magicky nehledá.
Ostatně obdobně funguje LimitedScope v Nette.

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: