Implementere egen include funktion

Tags:    php

<< < 12 > >>
Jeg har brug for at implementere min egen include funktion i PHP, da jeg vil have noget exception handling på include.

Funktionen i sig selv er meget simpel, den tjekker om filen eksisterer og includer den, ellers kaster den en exception.

Problemet er at filen bliver includet inde i funktionen, og derfor ikke er i samme scope som "uden for funktionen", hvorfor jeg ikke kan accesse nogle nødvendige variable.

Nogen der kan finde en klog løsning på det?

En løsning kunne være at indlæse filen og køre eval() på alle filens linjer, men det er simpelthen for klamt.



15 svar postet i denne tråd vises herunder
4 indlæg har modtaget i alt 4 karma
Sorter efter stemmer Sorter efter dato
hvad med bare at sige:
return include("fil.php"); ?



Det var ikke en joke med "global" statement.

Hvis vi bruger dit eksempel fra før, bliver den omskrevet kode, efter include, til:

Fold kodeboks ind/udKode 


Hvis du så smider global på $test = 'hejsa' i din fil, så bliver det til:

Fold kodeboks ind/udKode 


Og derved kan følgende lade sig gøre:
Fold kodeboks ind/udKode 



Ellers findes der en bruger tilføjet funktion extract_to() på php.net/extract
Hvis du bruger denne, hvor target er $GLOBALS, eller et objekt måske, burde du også være all-set. Men der er ikke nogen direkte måde til at ændre scope for en variabel, de ville alle ophøre når funktionen stopper.



Indlæg senest redigeret d. 08.02.2008 15:41 af Bruger #10216
Det som du kan prøve, og det som jeg selv ville gøre - sådan uden stører og kraftigere overvejelser - er at tildele dine includerede filer et uniked ID... Det er måske nok lidt bøvlet og snavsed code, men til det som du efterlyser, så må man ty' til utraditionelle metoder...

så...

Fold kodeboks ind/udKode 


Godt, koden oven over siger sig selv håber jeg. Jeg har forsøgt - sådan lidt hurtigt, og ikke specielt planlagt - at vise hvordan du kunne gribbe dette an... Koden er ikke ment som et færdigt produkt, snare som en inspiration.

Håber at du kan finde dette brugbart. :B

I øvrigt, den igangværende debat i denne artikel, så er det noget være slude at filer som inkluderes i specifike scope kun er tingængelige der... i PHP ihvertfald. Scope reglen gælder kun variabler, og det er go' skik og brug at man ikke anvender globale variabler i sin application, med mindre at der er tale om SQL connection ID'er, statiske configurationer, osv. Anbefales at hvis man ikke gider at se på en masse parametere i funktioner og OOP-Metoder, så brug arrays, i stedet for... dette gør også at man nemmere kan udbygge sine funktioner, metoder, osv. :lol::S



Indlæg senest redigeret d. 09.02.2008 02:44 af Bruger #11375
som sagt så er class og functioner altid globale, så mangler kun unscope variablerne.

Fold kodeboks ind/udKode 


test13.php
Fold kodeboks ind/udKode 



de overdrevne lange variable navne er for at undgå at overskrive variabler fra include filen, ved ikke helt om dette er relevant overhovedet :).

PS synes det er en usædvanlig dårlig ide det her.

PPS men ikke mere dårligt end PHP ide med at lave nested functioner globale



knald global foran dine variabler

global $var = 'test';

Ellers kan __autoload måske bruges, men det er mest til brug med classes.



knald global foran dine variabler


Var det en joke? Og som du siger er __autoload til klasser, som jeg i øvrigt også bruger, men det fungerer nu som det skal.

Jeg kan lige prøve at vise noget simpel kode der forklarer mit problem.

test.php
Fold kodeboks ind/udKode 


include.php
Fold kodeboks ind/udKode 


I eksemplet her kunne det løses ved at erklære $test global. Men da min idé er helt at undgå at bruge php's include funktion, ville det ikke kunne lade sig gøre, da php-filen måske ville indeholde klasser, objekter, funktioner osv.



Indlæg senest redigeret d. 08.02.2008 15:06 af Bruger #3275
Jeg googlede lige lidt og fandt en php-udvikler der sagde det ikke kunne lade sig gøre. Lader dog lige tråden stå åben hvis det skulle vise sig at han tog fejl.



Problemet er jo at jeg vil undgå include funktionen helt og lave min egen implementering. Ved at bruge extract kan jeg kun importere variabler, og ikke funktioner klasser osv.



get_defined_vars() - http://dk.php.net/manual/en/function.get-defined-vars.php

Så lige en hurtig funktion:
Fold kodeboks ind/udKode 

Ikke testet, men konceptuelt skulle den være fin.



Indlæg senest redigeret d. 08.02.2008 16:55 af Bruger #2330
...ikke for at være en pain in the ass, men det ville være rart hvis folk ville læse de indlæg de svarer på inden de poster.

Dette har INTET med variabler at gøre. Dette har at gøre med at tage indholdet af en fil, og sætte det ind i en anden fil at gøre. Altså, funktionen af include. Altså ikke noget med variabler, men noget med filer i deres helhed.



Indlæg senest redigeret d. 08.02.2008 17:41 af Bruger #3275
<< < 12 > >>
t