Avatar billede mantichora Nybegynder
21. oktober 2008 - 10:30 Der er 11 kommentarer og
1 løsning

Ny eller gammel constructor?

Jeg hører hele tiden at man helst skal holde sig fra magic i PHP, hvilket naturligvis inkluderer __constructor - Derfor har jeg efter overgangen til PHP5, stadig brugt PHP4s constructor, men er i tvivl om den rent faktisk *er* hurtigere, og om der vil være problemer med den i PHP6.

Så, en gang for alle, hvad er bedst, både performance- og kompatibilitetsmæssigt? Er der andre grunde til at vælge den nye?

class Test {
function Test($arg) {
  ...
}
}

eller

class Test {
function __construct($arg) {
  ...
}
}
Avatar billede j4k0b Nybegynder
21. oktober 2008 - 11:50 #1
Hvem siger at man skal holde sig fra magic?
Avatar billede mantichora Nybegynder
21. oktober 2008 - 12:55 #2
Ikke at man skal holde sig fra det, men at det er langsomt. Naturligvis er det fint at bruge hvis der ikke er alternativer, men stort set alle benchmarks jeg læser, siger at magic er langsomt.
Derfor, når der er et direkte alternativ, er jeg interesseret i om der egentlig er en forskel.
Avatar billede olebole Juniormester
21. oktober 2008 - 20:17 #3
<ole>

Hvorfor tester du ikke bare begge metoder i nogle realistiske loops? Så _ved_ du, hvad der er hurtigst. Der bliver skrevet floder af vrøvl på WWW, så det er altid en rigtig god idé at lave sine egne tests  ;o)

/mvh
</bole>
Avatar billede mantichora Nybegynder
22. oktober 2008 - 09:33 #4
God idé, Ole.

  Iterations: 1000000
  1 (old): 2.7070028781891 s
  2 (new): 2.6952679157257 s
  Difference: 0.011734962463379 s
  Winner: 2

Mit benchmark viser at der absolut ingen forskel er på de to, så nu er der kun spørgsmålet tilbage: Er der nogen ANDEN grund til at vælge den nye, eller er det 100% en smagssag + den praktiske ting, at den gamle metode også virker på PHP4-servere?
Avatar billede olebole Juniormester
22. oktober 2008 - 11:13 #5
Ikke mig bekendt - udover at følge med sprogets udvikling. PHP4 servere er vel også på hastig vej ud  =)
Avatar billede olebole Juniormester
22. oktober 2008 - 11:19 #6
- men det ville være rart med en kommentar på det emne fra arne_v eller erikjacobsen. De har begge lidt længere hår på ryggen, hvad teori angår  =)
Avatar billede micc Nybegynder
22. oktober 2008 - 23:41 #7
Hvis du ikke behøver at sikre bagudkompatibilitet med php4 bør du helt klart bruge __constructer. Se for eksempel på den nedenstående stump kode:

------
class A {
  function A() {
    echo "Dette er klassens constructer";
  }

  function B() {
    echo "Dette er en komplet urelateret funktion, der ikke bør være en constructer";
  }
}

class B extends A {
}

$a = new A(); //skriver "Dette er klassens constructer"
$b = new B(); //skriver "Dette er en komplet urelateret funktion, der ikke bør være en constructer"

------

hvis du derimod havde brugt __construct ville et problem som dette aldrig opstå - selv hvis class A ikke har en funktion B vil du stadig blive nødt til at sige:
-----
class B extends A {
  function B() {
    parent::A();
  }
}
-----

Alt i alt er det en stor fordel at bruge php5 modellen. Selv sidder jeg og kæmper med netop problemer som de ovenstående, da jeg udvikler kode der skal være php4 kompatibelt.
Avatar billede olebole Juniormester
23. oktober 2008 - 00:39 #8
Man kan:

class PHP4Compat {
    function __construct() {
        // Code ...
    }
    function __destruct() {
        // Code ...
    }
    function PHP4Compat() {
        $this->__construct();
        register_shutdown_function(array($this, "__destruct"));
    }
}

- men er man nødt til at gøre koden PHP4 kompatibel, mister man jo en hel del af PHP5's fordele. Så heller installere to forskellige koder. Det giver et større arbejde nu, men sparer arbejdet med at skrive koden om, når de sidste PHP4-servere udfases  =)
Avatar billede micc Nybegynder
23. oktober 2008 - 11:04 #9
Den løsning er også den jeg pt anvender, men det bliver besværligt når constructeren skal acceptere et variabelt antal argumenter, da php4 ikke kan udføre objektmetoder via call_user_func_array(). Så er man nødt til noget i stil med:

class A {
  function A() {
    $this->constructargs = func_get_args();
    $this->__construct();
  }

  function __construct() {
    $args = $this->constructargs ? $this->constructargs : func_get_args();
    // kode ...
  }
}

Igen meget besværligt, så php5 måden er langt at foretrække.
Avatar billede mantichora Nybegynder
23. oktober 2008 - 17:48 #10
Det er selvfølgelig en forskel, men jeg må indrømme aldrig selv at have været i en situation, hvor en klasse forlængede en anden klasse, der havde en constructor af samme navn som den deriverede klasse.

Tak for input, begge to. Smid gerne svar :)
Avatar billede micc Nybegynder
23. oktober 2008 - 18:01 #11
Svar...

Jeg har nu heller ikke stødt på lige præcis det problem, men det ville da være fjollet at udsætte sig for sandsynligheden for at skulle kæmpe med den slags bugs, når det kan undgås uden større besvær. :)
Avatar billede mantichora Nybegynder
27. oktober 2008 - 15:46 #12
Ole?
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