Avatar billede 3xm Nybegynder
16. juli 2004 - 00:20 Der er 23 kommentarer og
1 løsning

PHP5 - underfunktioner i metoder

jeg har lige installeret php5 på min apache på min egen computer.

og er løbet ind i et kompatibilitetsproblem. i min gamle PHP (4.3.noget) ville nedenstående script virke fint, men her i 5.0.0 giver det denne fejl:


Fatal error: Non-static method dyr::laks() cannot be called statically in c:\mikkel\web\live\test.php on line 8


---------
scriptet:
---------

<?

class dyr {
  function fisk() {
    function laks() {
      return "mums!";
    }
    echo laks();
  }
}

$dyr = new dyr;

$dyr->fisk();

?>
---------

håber nogen kan hjælpe.

=)
Avatar billede Slettet bruger
16. juli 2004 - 00:33 #1
Hvad er det meningen, der skal ske? Jeg synes det virker meget underligt at erklære en ny funktion inde i en anden.
Avatar billede 3xm Nybegynder
16. juli 2004 - 00:37 #2
meningen er bare at den skal være hjælpefunktion.

fx. en række ting jeg gerne vil gøre flere gange inde i fisk() men noget som ikke relevant udenfor fisk()

helt konkret der hvor jeg stødte på fejlen er det en række sql-ting som er relevante for noget statistikberegning. en ting som ikke kan bruges til noget som helst udenfor.

=)
Avatar billede Slettet bruger
16. juli 2004 - 00:46 #3
Bare et gæt, men prøv at er klære funktionen static, altså:

class dyr {
  function fisk() {
    static function laks() {
      return "mums!";
    }
    echo laks();
  }
}
Avatar billede 3xm Nybegynder
16. juli 2004 - 00:49 #4
har jeg i desperation prøvet. virker ikke.

=)
Avatar billede coderdk Praktikant
16. juli 2004 - 11:36 #5
class dyr {
  private function laks() {
    return "mums!";
  }
  function fisk() {
    echo $this->laks();
  }
}
Avatar billede coderdk Praktikant
16. juli 2004 - 11:37 #6
Der er ikke nogen (specielt god) grund til at lave funktioner i funktioner, når man har protected/private deklarationer...
Avatar billede coderdk Praktikant
16. juli 2004 - 11:38 #7
PS. Erklær den protected hvis en nedarvet klasse også skal kunne tilgå den.
Avatar billede 3xm Nybegynder
16. juli 2004 - 11:42 #8
og hvad hvis jeg så KUN vil have at det er fisk der skal kunne bruge den?

=)
Avatar billede coderdk Praktikant
16. juli 2004 - 11:56 #9
Hvad i alverden ville du opnå ved dét?
Avatar billede 3xm Nybegynder
16. juli 2004 - 12:01 #10
i mine øjne overskuelighed.

jeg kan ikke se nogen grund til at resten af min kode skal have adgang til en funktion som kun kan bruges til det ene specifikke formål i denne statistikfonktion.

der er fx. ingen grund til at mit billedmodul regner på hvor mange besøgende der har været mellem tid x og tid y.

ikke at det er noget problem for mig at rykke den ud og gøre den private/protected, men jeg synes bare det er underligt at man ikke kan gøre det længere, for der er - i mine øjne - en vis logik i at kunne gøre det.

=)

=)
Avatar billede coderdk Praktikant
16. juli 2004 - 12:03 #11
Nææh, det er vel et spørgsmål om design. Hvad laver dit billedmodul med dit statistikmodul er spørgsmålet :D Måske du skulle refaktorere lidt :)
Avatar billede 3xm Nybegynder
16. juli 2004 - 12:07 #12
nå, pyt. jeg siger tak for ordudvekslingen. lader den lige stå for en stund i tilfælde af at sandbox også føler sig berettiget til nogle point. så kan i dele. ellers får du dem, coderdk.

=)
Avatar billede coderdk Praktikant
16. juli 2004 - 12:12 #13
Ok :) Faktisk var jeg slet ikke klar over at underfunktioner ikke virkede i php5... Jeg bruger dem også et par steder - men kun til småfunktioner som jeg ikke klar lavet i klasser...
Avatar billede 3xm Nybegynder
16. juli 2004 - 12:13 #14
virker det udenfor klasser? (hvorfor prøver jeg ikke bare...)

=)
Avatar billede coderdk Praktikant
16. juli 2004 - 12:14 #15
heheh ja det ved jeg faktisk ikke - har ikke lige p.t. php5 installeret
Avatar billede 3xm Nybegynder
16. juli 2004 - 12:15 #16
det gør det, ja. bare til almen information.

mon det er bevidst fra php-teamets side at man ikke skal kunne eller er en eller anden form for bug?

=)
Avatar billede coderdk Praktikant
16. juli 2004 - 12:18 #17
Hmm ja det lyder lidt suspekt. For mig lyder det som en bug. Enten burde det ikke virke nogen steder, eller også burde det virke alle steder ;) Man kan selvfølgelig argumentere for at funtioner er funktioner, og objekter/klasser/metoder er anderledes...
Avatar billede 3xm Nybegynder
16. juli 2004 - 12:20 #18
ja, det er jo det. men alligevel... tror jeg vil grave lidt dybere i det.

=)
Avatar billede coderdk Praktikant
16. juli 2004 - 12:21 #19
Synes ikke jeg kunne finde noget på bugs.php.net om det - du kan evt. prøve at submitte en bug ;P

http://bugs.php.net/report.php
Avatar billede Slettet bruger
16. juli 2004 - 13:15 #20
Jeg skal ikke have point, jeg kom jo bare med et enkelt gæt, som ikke virkede.
Avatar billede erikjacobsen Ekspert
16. juli 2004 - 13:22 #21
Eksempel 12.3 i http://dk.php.net/manual/en/language.functions.php
viser lidt om at funktoiner i funktioner ikke fungerer som du regner med.
Læg mærke til at bar() ikke kun er kendt i foo(). I en klasse opnår du
derfor ikke noget yderligere "beskyttelse" ved at definere en funktion i en
funktion ud fra denne filosofi. Man kan slet ikke gøre sådan i Java, som
PHP5 læner sig meget op af, og øjensynligt heller ikke her. Om det ligefrem
er en bug, skal jeg ikke kunne sige, men man plejer blot at lade sådan en
hjælpefunktion være 'private' ved siden af.
Avatar billede 3xm Nybegynder
16. juli 2004 - 16:06 #22
erikj, tak for det. god læsning. især kommentarerne. den fra  09-Jun-2003 05:04 forklarer meget godt hvad jeg regnede med burde ske.

hvis du med dette link føler dig berettiget til point, så smid et svar.

=)
Avatar billede erikjacobsen Ekspert
16. juli 2004 - 17:25 #23
;) nej tak...
Avatar billede 3xm Nybegynder
16. juli 2004 - 17:28 #24
så lukker jeg. tak for hjælpen, allesammen.

=)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester