Autor Zpráva
kixs
Profil *
Kvůli zjednodušení psaní dlouhých cest jsem si napsal funkci, která vezme vstupní parametr a vnoří do aplikace php soubor. Zádrhel je, že v takto vnořeném souboru nemohu přistupovat k proměnným hlavního php souboru. Php to asi interpretuje tak, že proměnné ve vnořeném souboru jsou uvnitř funkce. Otázka zní jak učinit tento kód funkčním?
hlavni.php
<?

function loadInc($inc) {
	include __DIR__. "/$inc.php";
}

$prom = 'promenna';
loadInc('vnoreny');

?>

vnonery.php
<?

var_dump($prom);

?>
Keeehi
Profil
Měl bys vědět, jak funguje include. Představ si to asi takto: Na začátku, než se začne vůbec script provádět se celý script projde a na příslušná místa se místo include "soubor" vloží obsah souboru a potom se začne script provádět. Ve skutečnosti to tak není ale pro ilustraci to stačí takže ti z toho vznikne toto:
<?php

function loadInc($inc) {
    var_dump($prom);
}

$prom = 'promenna';
loadInc('vnoreny');

?>
Z čehož je vidět, proč to nejde.

Řešením by bylo do souboru vnoreny.php přidat řádek,
global $prom;

pak vznikne tato funkce,
function loadInc($inc) {
    global $prom;
    var_dump($prom);
}
a ta už funguje jak si představuješ. (je to ale ošklivé)
kixs
Profil *
Takže jinak řečeno je správnější používat přímo include než si to zkracovat a pak používat $_GLOBALS? :-/
Keeehi
Profil
ano
Mastodont
Profil
IMHO je lepší používat require a ještě o fous lepší require_once. Bez scházejícího souboru se většinou stejně nedá pokračovat.
kixs
Profil *
Require se chová jinak než include pokud to provedu uvnitř funkce? Jinak require je asi lepší, ale proč require_once - v kódu to není nutné a zbytečně bych donutil php provádět kontrolu už vnořených souborů.
Nox
Profil
kixs:
Ne... jen vyhodí fatální chybu místo varování, pokud se nepodaří soubor načíst

_once samozřejmě dáš jen tam, kde se nesmí to stejné načíst víckrát

Jinak hádám, že pro to _once má PHP nějaký interní seznam toho co už načetlo, neprovádí to nějakou kontrolu vnořeného...něčeho
DoubleThink
Profil *
kixs:
Takové zkracování kódu je na nic. Pokud máš moc includů, použij autoload.
kixs
Profil *
DoubleThink:
Autoload používám na třídy, které se můžou někdy hodit. Jenže autoload se nedá použít pokud potřebuju poskládat HTML stránku, kde head.php je hlavička ...

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: