Avatar billede alvion Nybegynder
02. november 2004 - 13:26 Der er 11 kommentarer og
1 løsning

PHP5: Nedarvning af Singleton funktionalitet

Jeg prøver at lave en grundlæggende Singleton klasse, der kan bruges som udgangspunkt til andre klasser. Men når jeg prøver at nedarve Singleton klassen, og oprette en instans af den nye klasse, så er det Singleton klassen, der bliver instantieret.

Jeg anvender en factory-method.

<?php
class Singleton {
    private static $instance = false;

    public static function getInstance() {
        if (self::$instance === false) {
            self::$instance = new self;
        }
        return self::$instance;
    }

    public function hallo() {
        echo "Hallo\n";
    }
}


class MySingleton extends Singleton {
    public function hallo() {
        echo "Davs med dig\n";
    }
}

$c = MySingleton::getInstance();
$c->hallo();
?>

Ovenstående burde (efter mit hovede) printe "Davs med dig". Men det printer "Hallo".

Hvis jeg kopierer funktionen getInstance() ned i den nedarvede klasse, så fungerer det. Men det er jo lige præcist det, som jeg vil undgå.
Avatar billede fynbo Nybegynder
02. november 2004 - 13:32 #1
Hvad er fordelen ved at bruge OOP i PHP? :)
Avatar billede alvion Nybegynder
02. november 2004 - 13:37 #2
Tja... jeg vil jo nok mene, at fordelene er de samme som i andre OO-sprog (hvilket man godt kan kalde PHP efter version 5).
Avatar billede jakoba Nybegynder
02. november 2004 - 13:38 #3
problemet er at en singleton ikke har en normal constructor. Den statiske funktion getInstance vil altid virke på den klasse den er defineret i, så du er nødt til at lave en ny getInstance funktion hver gang du exrtender din singletonklasse.
Avatar billede riversen Nybegynder
02. november 2004 - 13:42 #4
konstruktøren skal vel også lige gøres private?
Avatar billede alvion Nybegynder
02. november 2004 - 13:52 #5
jakoba -> Pokkers, det var lige præcist det, som jeg ville undgå
Avatar billede alvion Nybegynder
02. november 2004 - 14:06 #6
Er det så ikke mere "korrekt", at definere Singleton som et interface?

<?php
interface Singleton {
    public static function getInstance();
}


class MySingleton implements Singleton {
    private static $instance = false;

    public static function getInstance() {
        if (self::$instance === false) {
            self::$instance = new self;
        }
        return self::$instance;
    }

    public function hallo() {
        echo "Davs med dig\n";
    }
}

$c = MySingleton::getInstance();
$c->hallo();
?>
Avatar billede jakoba Nybegynder
02. november 2004 - 14:39 #7
enig, det er bedre med et interface.

eller du kunne evt lave din singleton variable, med en parameter i metoden getInstance. I det aktuelle tilfælle ville det blive:

<?php
class Singleton {
    private static $instance = false;
    private static $minBesked;

    private Singleton ( ) {
    }

    public static function getInstance($besked="hallo\n") {
        if (self::$instance === false) {
            self::$instance = new self;
            self::$minBesked = $besked;
        }
        return self::$instance;
    }

    public function hallo() {
        echo $this->minBesked;
    }
}

$c = MySingleton::getInstance("Davs med dig\n");
$c->hallo();
?>

men din virkelighed er nok en tand mere kompliceret end det :-))

mvh JakobA
Avatar billede jakoba Nybegynder
02. november 2004 - 14:42 #8
Ups, glemte af fjerne 'My'
$c = Singleton::getInstance("Davs med dig\n");
Avatar billede alvion Nybegynder
02. november 2004 - 14:48 #9
Jep du har ret - det er et forsimplet eksempel. Jeg tager interface-modellen.

Ok tak for "sparringen" - kom med et svar og få dine velfortjente point.
Avatar billede jakoba Nybegynder
02. november 2004 - 14:51 #10
ok
Avatar billede googolplex Novice
02. november 2004 - 20:07 #11
Avatar billede alvion Nybegynder
02. november 2004 - 21:24 #12
gogoplex -> Ja den har jeg allerede set på - og den løser ikke mit problem. Men tak for forsøget. :-)

jakoba -> Værsgo
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