Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

ciklus u include fajlovima iako eksplicitno stavim exit()

[es] :: PHP :: ciklus u include fajlovima iako eksplicitno stavim exit()

[ Pregleda: 3415 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

StMilan

Član broj: 5061
Poruke: 144
*.ptt.yu



Profil

icon ciklus u include fajlovima iako eksplicitno stavim exit()04.06.2004. u 22:29 - pre 241 meseci

fajl1.php:
Code:

include_once 'temp.php';
...
function a() {
...
}


temp.php
Code:

include_once 'template.php';
exit();


template.php
Code:

...
<?php
include fajl1.php; //ovde u stvari vidim ko je $PHP_SELF pa to ukljucim
?>
...


Teorijski to bi trebalo da ide ovako. PHP krene da parsira fajl1.php. Odmah u prvom redu predje u temp.php a tu odmah predje u template.php. Tu sve lepo ispise, dodje do dela gde treba da ukljuci fajl1.php, ode u fajl1.php, ne udje ponovo u temp.php zbog include_once, zavrsi ceo fajl1.php, vrati se nazad u template.php, dovrsi stranu, vrati se nazad u temp.php tu vidi exit() i stane.
Medjutim ako imam bilo kakvu funkciju u fajl1.php dobijem fatalnu gresku zbog duple definicije funkcije. To otprilike znaci da je PHP isparsirao ceo fajl1.php na pocetku. Medjutim te funckije nisu dostupne u template.php (probao sam da pozovem neku pre include u tom fajlu).

Kako uopste funkcionise mehanizam ukljucivanja fajlova u php-u? Ja sam mislio da se tu parsira red po red, ali ocigledno da nije. Moze li neko da mi kaze gde gresim.
 
Odgovor na temu

-zombie-
Tomica Jovanovic
freelance programmer
ni.ac.yu

Član broj: 4128
Poruke: 3448
*.beotel.net

Sajt: localhost


+5 Profil

icon Re: ciklus u include fajlovima iako eksplicitno stavim exit()05.06.2004. u 17:16 - pre 241 meseci
meni lepo radi pozivanje funkcije a() iz template.php (naravno, ako je poziv pre include('fajl1.php')).

čak sam proverio i na serveru (php 4.2.2), jer kod sebe imam samo php5. i naravno, radi i na jednom i na drugom mestu..

a php parsovanje radi tako što prvo prevodi izvorni kod u neki međukod, tzv bytecode (slično javinom bytekodu), pa ga tek onda izvršava.

u stvari, nisam siguran da više postoji i jedan "pravi interpreter" koji direktno izvršava izvorni kod, jer je to ubistvo (u petlji koja se vrti 1M puta, interpreter bi milion puta parsovao istu liniju, što bi trajalo danima)..

 
Odgovor na temu

StMilan

Član broj: 5061
Poruke: 144
*.ptt.yu



Profil

icon Re: ciklus u include fajlovima iako eksplicitno stavim exit()05.06.2004. u 21:38 - pre 241 meseci
a() se vidi i kod mene. Ne znam zasto se nije videlo ranije, verovatno moja greska.

Ali to opet ne resava moj problem. Kako da izveden ono sto sam hteo?

Ja hocu da ukljucim taj fajl1.php u template.php, ne zelim da imam neki switch u template.php pa na osnovu toga da ukljucim sta mi treba, nego hocu da ukljucim pozivajuci fajl.

A samo parsiranje, naravno da ne ide red po red bukvalno, nego sam mislio zasto se tako ne ponasa, odnosno da ja to tako vidim.

 
Odgovor na temu

-zombie-
Tomica Jovanovic
freelance programmer
ni.ac.yu

Član broj: 4128
Poruke: 3448
*.beotel.net

Sajt: localhost


+5 Profil

icon Re: ciklus u include fajlovima iako eksplicitno stavim exit()06.06.2004. u 15:36 - pre 241 meseci
prvo sory za parsiranje, nisam ja tebe dobro razumeo..

ono što si ti pitao, a očigledni odgovor je da se pri parsiranju automatski odradi i deklaracija (definisanje?) funkcija nađenih u kodu, jer da se to tada ne radi, ne bi se funkcije mogle pozivati pre deklaracije, pa neke stvari ne bi ni bile moguće, npr dvostruka rekurzija..


e sad, ovo što sam opisao se dešava samo sa funkcijama koje mogu da se detektuju (deklarišu, definišu?) bez izvršavanja bilo kakvog koda, tj sa onima koje su na najvišem nivou. ali pošto je php skript jezik, mogući su i ovakvi konstrukti:

Code:
if ($uslov) {
    function a() {
        echo 'do smth..';
    }
}


u ovakvoj postavci, funkcija a() će biti deklarisana tek kada se skripta izvrši (a ne pri parsiranju/kompajliranju), i to samo ako je $uslov ispunjen..

ti možeš da iskoristiš isto to, stim da može uslov da ti bude konstanta (true), tj da deklaracija praktično bude bezuslovna, samo "run-time" umesto "compile-time".. ;)

mislim, ovo definitivno jeste hack, i možda je nezgodno sve funkcije, tj praktično ceo fajl uokviriti uslovom, ali mi se čini da je to jedini način..

btw, jel možeš malo detaljnije da objasniš tvoju postavku zbog koje ti je sve ovo neophodno u ovom obliku? baš me zanima..
 
Odgovor na temu

StMilan

Član broj: 5061
Poruke: 144
*.ptt.yu



Profil

icon Re: ciklus u include fajlovima iako eksplicitno stavim exit()08.06.2004. u 03:38 - pre 241 meseci
Nisam bas shvatio sta si mislio sa deklaracijom/definicijom zbog dvostruke rekurzije.

Elem, evo zasto sam ja sve ovo radio.

Koristim paket iz PEARa HTML_QuickForm_Controller. Iako ima dosta mana, koristio sam ga ranije kada sam morao nesto da pisem u PHPu, pa posto nisam nista znao, isao sam logikom da iskoristim sto vise gotovih stvari.

Sada sam isao slicnom logikom, treba da uradim projekat za faks, pa rekoh kad vec to kao znam ajde ponovo.

Problem koji sam imao je to sto Controller poziva sebe preko stranice sa koje je prvo pozvan. U mom slucaju je to bio index.php koji u sebi ukljuci neki drugi php fajl. Medjutim, kada ja odradim nesto, tj. korisnik popuni jednu formu i hoce da predje na sledecu, posto je u formi action=index.php ja ne znam odakle sam stigao, a moram ponovo da ukljucim isti taj fajl (recimo RegisterUser.php) da bi sve bilo ok.
index.php moram da imam u celom tom ciklusu jer je to u stvari template za izgled sajta, forme popunjavaju samo jedan deo ekrana.
Zato sam hteo da nekako izvedem da taj konkretni php fajl ukljuci index, index njega i svi srecni i zadovoljni.
E to ne radi, i na kraju sam morao u sesiji da pamtim sta radim, pa u indexu proverim koja je akcija u pitanju (recimo registrovanje) i ukljucim opet taj odgovarajuci fajl.
Elegantnije sam mogao da resim modifikovanjem samih fajlova iz PEARa ali to naravno nisam hteo da radim. Sve u svemu, na kraju sam se nekako snasao.

Tvoj hack deluje interesantno, ali je malo nezgodno da u svakom fajlu vodim racuna da ne zeznem if, a plus ne radim sam na projektu.

Sve u svemu, mnogo mi se vise svidjaju tipizirani jezici. :)
 
Odgovor na temu

[es] :: PHP :: ciklus u include fajlovima iako eksplicitno stavim exit()

[ Pregleda: 3415 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.