Avatar billede etech2k Nybegynder
03. marts 2005 - 14:57 Der er 7 kommentarer

Singleton problmer i PHP

Jeg har lavet en singleton klasse, Basket.php
Men hver gang jeg kalder den bliver der lavet et nyt instance af den.

<?php
class Basket
{
    static private $instance = null;
    private $liste;
   
    private function __construct()
    {
       
        $this->liste = array();
    }
       
    public static function &getInstance()
    {
        if(self::$instance==null)
        {
            echo "opretter instance".rand(1,10000);
            self::$instance = new Basket();   
        }
   
        return self::$instance;
    }
   
    public function pushProduct($object)
    {
        array_push($this->liste,$object);
    }
   
    public function popProduct($object)
    {
        $newListe = array();
        for($i=0; $i<count($this->liste);$i++)
        {
            if($this->liste[$i]!=$object)
            {
                array_push($newListe,$this->liste[$i]);
            }
        }
        $this->liste = $newListe;
    }
   
    public function getList()
    {
        return $this->liste;
    }
}   
?>

Jeg kalder den på denne måde:

<?php
include_once("class/Basket.php");
$basket = Basket::getInstance();
$basket->pushProduct($object);
?>
Avatar billede etech2k Nybegynder
03. marts 2005 - 15:02 #1
Det skal siges at jeg benytter den seneste release a PHP5.
http://5sem.terrain.nu/TEST/phpinfo.php
Avatar billede coderdk Praktikant
04. marts 2005 - 02:25 #2
Uhm hvad siger den hvis du laver dette:

<?php
include_once("class/Basket.php");
$basket = Basket::getInstance();
$basket->pushProduct($object);
$basket2 = Basket::getInstance();
$basket2->pushProduct($object);
$list = $basket->getList();
echo "<pre>"; var_dump( $list ); echo "</pre>";
?>
Avatar billede etech2k Nybegynder
04. marts 2005 - 08:48 #3
Det vil være det samme,
Et singleton pattern skal sørge for at der kun er en instans af klassen over hele systemet.
Men hver gang at Basket::getInstance(); bliver kaldt oprettes der et nyt instans
Avatar billede coderdk Praktikant
04. marts 2005 - 09:00 #4
Ja, det virker da fint, når jeg kører det får jeg dette output:

opretter instance5038

array(2) {
  [0]=>
  string(5) "hejsa"
  [1]=>
  string(5) "hejsa"
}


Så der bliver *ikke* oprettet en ny instans hver gang den bliver kaldt.
Avatar billede coderdk Praktikant
04. marts 2005 - 09:01 #5
Med denne kode:

  $object = "hejsa"; 
  $basket = Basket::getInstance();
$basket->pushProduct($object);
$basket2 = Basket::getInstance();
$basket2->pushProduct($object);
$list = $basket->getList();
echo "<pre>"; var_dump( $list ); echo "</pre>";

og din klasse...
Avatar billede etech2k Nybegynder
04. marts 2005 - 09:11 #6
Jo, men når du trykker på F5(refresh) opretter den da et nyt instans
Avatar billede coderdk Praktikant
04. marts 2005 - 09:17 #7
etech2k, Ja det er da klart, sådan skal det også være! PHP er stateless, så når scriptet er færdigt, så dør objektet. Hvis du vil persiste data for en bruger skal du gemme objektet i en session :P Evt. med serialization, men husk at du skal include din klasse før du unserializer...
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