Autor Zpráva
euzen
Profil
Zdravim,
mám menší problém s předáním dat. Situace je následující:

hlavní soubor index.php, který postupně includuje několik souborů. V prvním includovaném souboru je funkce, která mi vygeneruje data a ta si uložím do proměnné (pole). V dalším includovaném souboru potřebuji tato data využít, ale proměnná se tváří, že je prázdná.

v souboru index.php, jsem si vytvořil onu proměnnou, do které pak přes následující kód ukládám informace v prvním includovaném souboru
global $seznam;
$seznam[$idKategorie] = $ibg;


v druhém includovaném souboru pak následujícím způsobem potřebuji vypsat data, ale nefunguje to
global $seznam;
echo $seznam[$idKategorie];


Nevíte prosím někdo co s tím? Jak spolehlivě předat data?
Alphard
Profil
Include neovlivňuje viditelnost proměnných. Problém bude zřejmě v té funkci, kterou jste zmínil. Předejte data do global scope a pak je do další funkce vkládejte jako parametr. Nebo můžete použít global případně reference, ale není to hezké.
sysel
Profil
Opravte mne, jestli se mýlím, ale části kódu připojené direktivou include() jsou prostě jen jakoby dopsané*. Tedy by neměly obsahovat znovu pokyn
global $seznam
protože pak se pravděpodobně $seznam vytvoří znovu a prázdný.

global bych přestěhoval do hlavního souboru a v includovaných už jen počítal s globální proměnnou. Ostatně globální/lokální se vztahuje na platnost proměnných vně a uvnitř funkcí bez ohledu na to, zda je funkce definována v hlavním souboru či v includovaném.

*) pokud obsahují nějaké definice funkcí, je rozumnější použít
include_once()
jak se lze dočíst na indikovaných stránkách PHP5 vyhlásí fatální chybu při nalezení nové definice již deklarované funkce.
euzen
Profil
Asi jsem příliš nepochopil, jak bych to měl řešit.

V hlavní souboru mám:

global $seznam;


V souboru (includovaném), kde se ve funkci plní ona proměnná, mám uvnitř těla funkce:

$seznam[$idKategorie] = $ibg;


A v dalším includovaném souboru, kde data vypisuji mám:

echo $seznam[$tempo]


Mělo by to fungovat správně?
Tori
Profil
euzen
global se používá uvnitř funkcí. Ale pokud to není nezbytně nutné, tak bych spíš použiila návratovou hodnotu.
// include.php
function xyz() {
  // ...
  $out[$idKategorie] = $ibg;
  return $out;
}

$seznam = xyz();
euzen
Profil
Tori:
jde právě o to, že mi ta funkce generuje komplet kód celého menu, které se pak pomocí javascriptu "sestaví" a pokud bych tu funkci volal znovu, tak se mi to znovu vygeneruje, což nepotřebuji :/
Tori
Profil
euzen:
Tak asi nechápu, jak to myslíte.
// index.php
include_once('funkce.php');

  // funkce.php
  // - tady bude jen definice funkce vyrobMenu()
...
include('hlavicka.php');

  // hlavicka.php
  // tady si načtete data pro menu
  $menu = vyrobMenu();
  // a zobrazíte ho.

// pokračuje hlavní skript, includes pro obsah stránky, patičku
CZechBoY
Profil
//index.php
$lng=Array('pozdrav'=>'ahoj', 'odhlasit'=>'Brzy nashle');

//xyz.php
function preklad($text)
{
global $lng;
echo $lng[$text];
//případně return $lng[$text];
}
Majkl578
Profil
euzen:
a pokud bych tu funkci volal znovu, tak se mi to znovu vygeneruje, což nepotřebuji :/
To už raději použij static jako interní cache. Ale ani jedno řešení se nejeví jako dobré/správné.

function test()
{
    static $data;
    
    if ($data === NULL) {
        $data = 'foo'; // u tebe ta náročná operace
        echo 'called';
    }
    
    return $data;
}
test(); // called
test(); // nic
Slash24
Profil *
euzen:
jde právě o to, že mi ta funkce generuje komplet kód celého menu, které se pak pomocí javascriptu "sestaví" a pokud bych tu funkci volal znovu, tak se mi to znovu vygeneruje, což nepotřebuji :/

Načo by ste volal opatovne funkciu na vytvorenie menu ? Tori napísal dobré riešenie.

Jednoducho
<?php
include('funkcie.php'); 
//subor funkcie.php bude obsahovat nasledovnu funkciu

function createMenu () {
  //...
  //foreach ...
  $seznam[$idKategorie] = $ibg;
  
  return $seznam;
}

include('header.php');
//subor header.php bude obsahovat

$seznam = createMenu();

//do premennej seznam sa nam ulozi pole s hodnotami menu poloziek, takze na výpis stací iterovať pole pomocou cyklu (najlepsie foreach)
//nejako nasledovne

foreach ($seznam as $menu_item) {
  echo $menu_item;
}
?>

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