/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
"fjerne" funktionserklæring
Fra : Kim Schulz


Dato : 24-07-04 20:47

hejsa

sidder og roder med et problemer hvor der loopes igennem nogle blokke af
php kode som ligger i en database.
hver af disse kodeblokke bliver der så kørt eval() på og output bliver
så samlet til senere gennemsøgning.
Dette går også godt et langt stykke hen af vejen, indtil at en funktion
er erklæret i flere af blokkene.
så snart dette sker, så kommer der en redeclaration error.

Nogen der kender til en måde hvormed dette kan omgåes?
F.eks. noget med at man kunne slette funktions erklæringen fra funktions
tabellen eller noget i den stil.

MVH
Kim Schulz

 
 
Bertel Lund Hansen (24-07-2004)
Kommentar
Fra : Bertel Lund Hansen


Dato : 24-07-04 21:35

Kim Schulz skrev:

>Dette går også godt et langt stykke hen af vejen, indtil at en funktion
>er erklæret i flere af blokkene.

Så er der noget galt med dit design.

Kan du ikke erklære den i en fil som du inkluderer én gang?

Et hack består i at du omgiver filen af en test på en variabel.
Denne variabel sættes til true når filen inkluderes, men hele
blokken med funktionen skippes hvis variablen er sat:

if (!$declared) {
$declared=1;
function ditogdat(){
}
}

--
Bertel
http://bertel.lundhansen.dk/   FIDUSO: http://fiduso.dk/

Kim Schulz (24-07-2004)
Kommentar
Fra : Kim Schulz


Dato : 24-07-04 21:53

On Sat, 24 Jul 2004 22:35:24 +0200
Bertel Lund Hansen <nospamius@lundhansen.dk> wrote:

> Kim Schulz skrev:
>
> >Dette går også godt et langt stykke hen af vejen, indtil at en
> >funktion er erklæret i flere af blokkene.
>
> Så er der noget galt med dit design.

Tjaa måske. Det er for at man kan søge igennem sider oprettet i et
CMS hvor der godt kan indgå php på siderne.

> Kan du ikke erklære den i en fil som du inkluderer én gang?

nej ikke en mulighed.


> Et hack består i at du omgiver filen af en test på en variabel.
> Denne variabel sættes til true når filen inkluderes, men hele
> blokken med funktionen skippes hvis variablen er sat:
>
> if (!$declared) {
> $declared=1;
> function ditogdat(){
> }
> }

Det er en mulighed bort set fra at en phpblok kan se således ud:


$foo="";
$bar=1;
function foobar(){
.....
}
$noget=mere;
...
foobar();
if(foobar()==2){
   $nogetandet="";
}


altså ikke lige noget som man kan rette i og omslutte med den slags
blokke.
Desuden kunne der sagtens være en include i blokken også og i den
inkluderede fil kunne funktionen så ligge.

MVH
Kim Schulz

Jimmy (24-07-2004)
Kommentar
Fra : Jimmy


Dato : 24-07-04 22:07


"Kim Schulz" <kim@schulz.dk> wrote in message
news:20040724214631.0fee6467@lifesuckz.nork.auc.dk...
hejsa

sidder og roder med et problemer hvor der loopes igennem nogle blokke af
php kode som ligger i en database.
hver af disse kodeblokke bliver der så kørt eval() på og output bliver
så samlet til senere gennemsøgning.
Dette går også godt et langt stykke hen af vejen, indtil at en funktion
er erklæret i flere af blokkene.

Der findes en function_exists
http://dk2.php.net/manual/en/function.function-exists.php

som du kunne køre først, hvis du via regexp henter funktionsnavnet ud først.

Alternativt undertrykke fejl med @

mvh
Jimmy



Kim Schulz (24-07-2004)
Kommentar
Fra : Kim Schulz


Dato : 24-07-04 22:08

[snip]
> Jeg formoder, for at undgå kaos, at hver funktion har sin egen
række.

nix. hver php blok på en side har en række.


> Hvis du insisterer på at bevare "designet" kan du oprette en ekstra
> kolonne der f.eks. kan hedde "Function_Name" og så via SQL bruge
> DISTINCT.(Men der er da noget fundamentalt galt, hvis det overhovedet
> er muligt at lægge to identiske funktioner ind - det lyder som om det
> er dét problem der skal løses).

Den holder ikke i dette design.

> Ulemperne ved at have kode i en DB må da klart opveje fordelene ved at
> have dem i filer?

Kan ikke forstår hvor du vil hen med dette?

> Man bør da heller ikke kunne søge i *sourcen* til et CMS?

nej men man kan søge i det output som en brugers php på en side kan
generere. hvis nu han har en funktion som skriver noget tekst ud, så
skal søgefunktionen jo kunne søge i dette.


> Kan al indhold ikke ligge i DB og så stadig være søgbart?

ikke forstået.

> Eller er det fordi kunderne skal kunne udvikle egne funktioner?

Bruger med højere rettigheder i systemet har adgang til at kunne
indsætte blokke af php kode på sider (alle sider består af blokke af
forskellig type). Disse php kodeblokke kan indeholde al slags php og
derved og dermed altså også ting som include og funktioner.
når der søges, så genereres output som det ville være for alle sider, og
så søges dette igennem. Problemet er bare at når samme funktion går igen
over flere sider, ja så bliver funktionen erklæret flere gange.
Det er dette jeg vil undgå.

Kim Schulz (24-07-2004)
Kommentar
Fra : Kim Schulz


Dato : 24-07-04 22:09

On Sat, 24 Jul 2004 23:07:26 +0200
"Jimmy" <nyhedsgruppe2001@SPAM.yahoo.co.uk> wrote:

>
> "Kim Schulz" <kim@schulz.dk> wrote in message
> news:20040724214631.0fee6467@lifesuckz.nork.auc.dk...
> hejsa
>
> sidder og roder med et problemer hvor der loopes igennem nogle blokke
> af php kode som ligger i en database.
> hver af disse kodeblokke bliver der så kørt eval() på og output bliver
> så samlet til senere gennemsøgning.
> Dette går også godt et langt stykke hen af vejen, indtil at en
> funktion er erklæret i flere af blokkene.
>
> Der findes en function_exists
> http://dk2.php.net/manual/en/function.function-exists.php
>
> som du kunne køre først, hvis du via regexp henter funktionsnavnet ud
> først.

ja men 2 funktioner kan godt hedde det samme og gøre noget forskelligt,
så derfor er det ikke nok at tjekke på navn.




> Alternativt undertrykke fejl med @

Nej for jeg skal jo bruge output fra funktionerne.

Kim Schulz (24-07-2004)
Kommentar
Fra : Kim Schulz


Dato : 24-07-04 22:23

[snip]
>
> Så du leder efter en måde at finde identiske funktionsnavne og omdøbe
> den ene dynamisk?
>
> Ellers mister du jo mindst den enes funktionalitet.
>
> Jeg vil absolut fortsat mene at designet er defekt og at du skal løse
> problemet ved at undgå at funktioner overhovedet kan sættes flere
> gange ind i databasen.

jeg ville hellere have en "redeclare function foo" eller en måde hvor
man kan slette funktionserklæringer fra funktionstabellen.

MVH
Kim Schulz

Kim Schulz (24-07-2004)
Kommentar
Fra : Kim Schulz


Dato : 24-07-04 22:37

[snip]
> Forstået, men du siger at der kan være flere *forskellige*
funktioner
> med*samme* navne. Hvis du redeklarerer de efterfølgende mister du
> muligheden for at kalde de tidligere funktioner.

Hvad jeg ville gøre, var at gå alle elementer igennem på en side i
systemet. nogle af disse kan være php blokke som indeholder funktioner.
På samme side kan 2 php blokke ikke indeholde samme funktions erklæring.
Efter at have "udført" sidens indhold (Altså lavet eval på php elemener)
og søgt output igennem, så ville jeg "slette" funktionserklæringen.
En funktion på en side skal ikke kunne kaldes fra en anden side. Et et
sådanne tilfælde så kopierer man php elementet fra en side til en anden
og så er den der som 2 rækker (en for hver side).


> Eller de er måske allerede afviklet? Hvis ja, kunne man i mange
> tilfælde undlade at oprette en funktion til koden men blot afvikle
> koden.

Typisk eksempel er når man har en funktion som sætter noget kode pænt op
på siden (function printBeautifiedCode($string)).
Denne kan gå igen over flere sider hvis man f.eks. har en side om php og
en side om asp.


> Du kender din kode bedre end jeg gør, men jeg tror du låser dig fast
> på noget der er et hack og at et redesign ville være mere fornuftigt
> både nu og ved fremtidig vedligeholdelse.


Hvad ville du så foreslå der skulle ændres?


> Jeg har ikke kunne finde noget på google eller php.net omkring
> redeklarering. Der var noget der hed unregister_tick_function, men
> tror ikke den kan anvendes her.

Nej det er også det eneste jeg har kunne finde desværre.


MVH
Kim

Kim Schulz (25-07-2004)
Kommentar
Fra : Kim Schulz


Dato : 25-07-04 07:44

[snip]
> Jeg kan ikke helt forstå hvorfor to forskellige siders kode skal
> eval'es i samme kørsel.
> Jeg tolker "side" som den side en bruger ser i sin browser på et
> givent tidspunkt. Ser han PHP-siden, eval'er man udelukkende
> PHP-sidens kode. Det er måske her vi snakker forbi hinanden?
>

der er en søgefunktion som kan søge igennem alle siderne i systemet.
For at den kan dette, så bliver alle siderne nødt til at blive genereret
en efter en så output kan søges igennem (da noget kan være lavet af php
f.eks.). Når der ikke søges, så er der ingen problemer.


[snip]
>
> Hvad ville du så foreslå der skulle ændres?
>
> I min verden er funktioner noget man anvender, når man har et stykke
> kode, som man bruger mange steder. For at undgå at kopiere det ind
> mange steder indsætter man så funktionskaldet de steder koden skal
> anvendes.
>
> Som jeg læser dine indlæg har brugere mulighed for at paste den samme
> eller forskellige funktioner med ens navne ind på hver side der skal
> vises til brugere.
>
> Jeg ville oprette en tabel med alle funktioner, hvor Function_Name var
> UNIQUE.
> Når en bruger ville bruge en funktion indsatte han en reference til ID
> i tabellen i stedet for koden. F.eks. [FUNCTION_10] som let kan
> erstattes under gennemløb.
>
> I top.php inkluderer du så alle funktioner ved at løbe tabellen
> igennem, hvorfor du nu effektivt har sørget for at funktioner kun kan
> hentes een gang og at deres navne er unikke.
>
> Funktioners kode vedligeholdes nu kun eet sted og det er let at vide,
> hvilke funktioner der findes og hvad de hedder.


umiddelbart er dette bare ikke en løsning der kan bruges i dette cms da
det strider lidt mod den filosofi det bygger på.
Men nu har jeg da lidt at gå videre med, så må jeg se om jeg eller en af
de andre kan finde på noget smart.

Jacob Atzen (25-07-2004)
Kommentar
Fra : Jacob Atzen


Dato : 25-07-04 11:22

Kim Schulz <kim@schulz.dk> writes:

> sidder og roder med et problemer hvor der loopes igennem nogle blokke af
> php kode som ligger i en database.
> hver af disse kodeblokke bliver der så kørt eval() på og output bliver
> så samlet til senere gennemsøgning.
> Dette går også godt et langt stykke hen af vejen, indtil at en funktion
> er erklæret i flere af blokkene.
> så snart dette sker, så kommer der en redeclaration error.
>
> Nogen der kender til en måde hvormed dette kan omgåes?

Du kan benytte klasser som en form for "pseudo-namespaces".

--
Med venlig hilsen
- Jacob Atzen

Kim Schulz (25-07-2004)
Kommentar
Fra : Kim Schulz


Dato : 25-07-04 11:41

On 25 Jul 2004 12:21:38 +0200
Jacob Atzen <jacob@aub.dk> wrote:

> Kim Schulz <kim@schulz.dk> writes:
>
> > sidder og roder med et problemer hvor der loopes igennem nogle
> > blokke af php kode som ligger i en database.
> > hver af disse kodeblokke bliver der så kørt eval() på og output
> > bliver så samlet til senere gennemsøgning.
> > Dette går også godt et langt stykke hen af vejen, indtil at en
> > funktion er erklæret i flere af blokkene.
> > så snart dette sker, så kommer der en redeclaration error.
> >
> > Nogen der kender til en måde hvormed dette kan omgåes?
>
> Du kan benytte klasser som en form for "pseudo-namespaces".

ja den ide har jeg også tænkt på.
alle php elementer på en side skal så bare proppes ind i den samme
klasse og kald til funktioner osv. skal prependes med $this->

Jacob Atzen (25-07-2004)
Kommentar
Fra : Jacob Atzen


Dato : 25-07-04 11:54

Kim Schulz <kim@schulz.dk> writes:

> > Du kan benytte klasser som en form for "pseudo-namespaces".
>
> ja den ide har jeg også tænkt på.
> alle php elementer på en side skal så bare proppes ind i den samme
> klasse og kald til funktioner osv. skal prependes med $this->

Alle funktioner i hvert fald Du vil blive glad for
token_get_all().

--
Med venlig hilsen
- Jacob Atzen

Johan Holst Nielsen (25-07-2004)
Kommentar
Fra : Johan Holst Nielsen


Dato : 25-07-04 16:07

Kim Schulz wrote:

> hejsa
>
> sidder og roder med et problemer hvor der loopes igennem nogle blokke af
> php kode som ligger i en database.
> hver af disse kodeblokke bliver der så kørt eval() på og output bliver
> så samlet til senere gennemsøgning.
> Dette går også godt et langt stykke hen af vejen, indtil at en funktion
> er erklæret i flere af blokkene.
> så snart dette sker, så kommer der en redeclaration error.
>
> Nogen der kender til en måde hvormed dette kan omgåes?
> F.eks. noget med at man kunne slette funktions erklæringen fra funktions
> tabellen eller noget i den stil.

Du burde rimeligt nemt kunne lave en regular expression - som replacer
navnene på funktionerne med nogle nye - den kan dog blive lidt
kompliceret hvis de er afhængige af hinanden..

Men har du lidt source jeg evt. kan kigge på?

mvh
Johan

Kim Schulz (25-07-2004)
Kommentar
Fra : Kim Schulz


Dato : 25-07-04 19:50

On Sun, 25 Jul 2004 19:07:20 +0200
Johan Holst Nielsen <phpgeek@gmail.com> wrote:

> Kim Schulz wrote:
> >>Jeg kan ikke helt forstå hvorfor to forskellige siders kode skal
> >>eval'es i samme kørsel.
> >>Jeg tolker "side" som den side en bruger ser i sin browser på et
> >>givent tidspunkt. Ser han PHP-siden, eval'er man udelukkende
> >>PHP-sidens kode. Det er måske her vi snakker forbi hinanden?
> >
> > der er en søgefunktion som kan søge igennem alle siderne i systemet.
> >
> > For at den kan dette, så bliver alle siderne nødt til at blive
> > genereret en efter en så output kan søges igennem (da noget kan være
> > lavet af php f.eks.). Når der ikke søges, så er der ingen problemer.
>
> Ville det nemmeste ikke være at lave en
> file_get_contents (eller ældre versioner file kombineret med implode).
>
> Det vil dog muligvis resultere i noget ekstra trafik - evt. kunne
> localhost jo blot kaldes (kender ikke din opsætning osv.).
>
> Ved ikke om det er en mulighed?

og faktisk ikke en hel dum ide, selv om den jo ganske rigtigt kan smadre
statistik lidt.

Nezar Nielsen (26-07-2004)
Kommentar
Fra : Nezar Nielsen


Dato : 26-07-04 11:02

Kim Schulz wrote:

> Nogen der kender til en måde hvormed dette kan omgåes?
> F.eks. noget med at man kunne slette funktions erklæringen fra funktions
> tabellen eller noget i den stil.

Jeg tror ikke det er muligt, uden at lave en underlig extension, at
slette noget fra symboltabellen, men du kunne også omskrive koden, så
function xx(...) { ... }
blev til
$xx = create_function(..., ...);
og så erstatte alle kald til xx med $xx.

--
Mvh. Nezar Nielsen
http://fez.dk

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408929
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste