DevProTalk

DevProTalk (http://www.devprotalk.com/index.php)
-   PHP (http://www.devprotalk.com/forumdisplay.php?f=9)
-   -   Templates, Singleton etc. (http://www.devprotalk.com/showthread.php?t=364)

degojs 15. 11. 2005. 13:46

Citat:

Ilija
Osnovna svrha Singletona je da osigura da imaš jednu instancu klase.
Pa šta se dešava kad na sajt dođu dva posetioca a singleton sprečava da imamo dve instance shopping cart-a?

degojs 15. 11. 2005. 13:49

Citat:

Ne zna koje jezike koristiš, ali u PHPu je generalan problem imati "opštepristune" promenljive.
Kakve veze ima singleton sa rešenjem ovog problema?

Za rešenje ovog problema dovoljno je imati klasu sa statičkim poljima, singlton je nebitan u toj priči.

noviKorisnik 15. 11. 2005. 14:29

Citat:

Originalno napisao godza
sorry korisniche, nemoj misliti da se pravim drvenim advokatom, ali verujem da je ilija omashkom napisao $ isred poziva staticke metode, jel to ovako ne bi radilo.

Nije Ilija to napisao već bluesman, Ilija samo nije preciznije objasnio zašto pominje dolare (pa sam ja uskočio kao drveni advokat, a sad ako sam zabrljao... upucaću poruku, no problemo).

bluesman 15. 11. 2005. 14:57

Izvninjavam se, ja sam ubacio $ ispred, moja greska. Ali to je nebitno za pricu, zar ne? Moze dalje? Da li moze objasnjenje zasto je toliko vazan singleton ovde.

degojs_ 15. 11. 2005. 16:06

Ma najmanji je problem u definiciji, a veći u korišćenju.

Zašto bi koristio singleton klasu za nekakve globalne promenljive? Ja nisam nikad koristio PHP, ali evo gledam primer na PHP sajtu, tačno ono što sam napisao pre - statička polja u klasi i kraj priče. Zašto bi sad ovo čovek komplikovao dalje singltonom? Šta propuštam?

Kôd:

class Foo
{
  public static $my_static = 'foo';
}

...
print Foo::$my_static . "\n";


Dalje, ShoppingCart koji je singleton - šta se dešava kad imaš 10 posetioca na sajtu, a singleton svima daje referencu na jedan objekt? Zato sam i tražio da Ilija pokaže neki primer.. pa da vidimo. Šta propuštam i ovde?

O.T.
@bluesman ili ko već ima mogućnosti:
da prijavim da neće da mi pošalje password na mail (javi samo Bad Request sa servera)? Evo me na poslu, zaboravio sam koji je pass, pa sam morao da kreiram novi, ovaj, nalog :-)

noviKorisnik 15. 11. 2005. 19:10

Citat:

Originalno napisao degojs_
Dalje, ShoppingCart koji je singleton - šta se dešava kad imaš 10 posetioca na sajtu, a singleton svima daje referencu na jedan objekt?

Pomislio sam da se šališ kad si ovo prvi put pomenuo. Ta jedinstvenost se gleda na nivou izvršenja skripte, dakle jedan zahtev, jedan korisnik, jedna stranica, itd. Inače, i meni deluje preterano navođenje "jedna instanca" jer zašto onda uopšte instanca ako je jedinstvena. Insistiranje na pozivu metoda umesto direktnog pristupa propertima... jeste preporuka za neke objektne manire, ali nije baš i da mora tako.

degojs 15. 11. 2005. 19:31

Pazi,

nemaš ti šta da kažeš "ta jedinstvenost se gleda na nivou.." To je pogrešno. To je restrikcija koju ti sad uvodiš, a singleton to nigde ne navodi.

Ili imaš max samo jedan objekt date klase ili možeš da instanciraš više objekata. Prosto.

Bar ja tako vidim singleton, a daću ti i primer pravog singletona :)

Primer singletona bi bio objekt koji radi sa log fajlom, a svi posetioci na sajtu imaju referencu na jedan te isti objekt. Vidiš, nema nikakvog posmatranja "na nivou.." - svi posetioci imaju referencu na jedan te isti objekt, koga i treba da bude samo jedan. Drugi primer.. evo sad mi pade na pamet - samo jedan COM1 port, pa onda samo jedan printer spooler objekt, itd itd.

Kako god okreneš, ne štima nešto. Ako je svaka instanca ShoppingCart-a zasebna za sesiju, onda to ili nije singleton ili ti singleton d.p. uopšte ne treba, a ako imaš pravi singleton, onda ćeš doći u situaciju da ShoppingCart bude deljen između posetioca, zar ne? Voleo bih da Ilija lepo stavi primer koda koji on koristi (ShoppingCart a la singleton), što sam i tražio, pa da pogledamo.

dinke 15. 11. 2005. 20:17

Evo primera Singletona u php5:

PHP kôd:

<?php
class Example
{
   
// Hold an instance of the class
   
private static $instance;
  
   
// A private constructor; prevents direct creation of object
   
private function __construct()
   {
       echo 
'I am constructed';
   }

   
// The singleton method
   
public static function singleton()
   {
       if (!isset(
self::$instance)) {
           
$c __CLASS__;
           
self::$instance = new $c;
       }

       return 
self::$instance;
   }
  
   
// Example method
   
public function bark()
   {
       echo 
'Woof!';
   }

   
// Prevent users to clone the instance
   
public function __clone()
   {
       
trigger_error('Clone is not allowed.'E_USER_ERROR);
   }

}

?>

Source: http://www.php.net/manual/en/language.oop5.patterns.php

degojs 15. 11. 2005. 20:29

E dobro, pitanje je sad: da li je instanca objekta deljena među posetiocima (različitim sesijama), pošto se referenca na nju čuva u statičkom polju?

Ako jeste, ne možemo da koristimo takav ShoppingCart jer će da nastane zbrka - svi će da koriste isti objekt, a ako nije --- šta će nam uopšte singleton (te se slažem sa, čini mi se imenjakom, noviKorisnik)?

Ajd, vi tamo svi imate php pa možete lako da proverite da li su statička polja klasa deljena među sesijama.

noviKorisnik 15. 11. 2005. 20:40

Pa nisu. Život PHP objekta najduže traje koliko izvršenje skripte. Najčešće kao rezultat toga bude stranica prema klijentu. Privid perzistencije objekta je čuvanje objekta u sesiji i restauracija pri sledećem pozivu skripte. Sesija naravno ide po korisniku, nije deljena.

Ako neka vrednost treba da bude globalna na nivou sajta, za sve posetioce, čuvaće se u bazi ili u fajl sistemu.


Vreme je GMT +2. Trenutno vreme je 01:14.

Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.

Mišljenja, saveti, izjave, ponude ili druge informacije ili sadržaji nastali na Sajtu su vlasništvo onoga ko ih je kreirao, a ne DevProTalk.com, tako da ne morate da se oslanjate na njih.
Autori poruka su jedini odgovorni za ovakve sadržaje. DevProTalk.com ne garantuje tačnost, kompletnost ili upotrebnu vrednost informacija, stavova, saveta ili datih izjava. Ne postoje uslovi pod kojima bi mi bili odgovorni za štetu ili gubitak koji je posledica bilo čijeg oslanjanja na nepouzdane informacije, ili bilo kakve informacije nastale kroz komunikaciju između registrovanih članova.
Web sajt može sadržavati linkove na druge web sajtove na Internetu ili neke druge sadržaje. Ne kontrolišemo niti podržavamo te druge web sajtove, niti smo pregledali bilo kakve sadržaje na takvim sajtovima. Mi nećemo biti odgovorni za legalnost, tačnost ili prikladnost bilo kog sadržaja, oglasa, proizvoda, usluga ili informacije lociranim na ili distribuiranih kroz druge web sajtove, niti za bilo kakvu štetu nastalu kao posledica takvih informacija. DevProTalk.com drži i čuva druga prava vlasništva na web sajtu. Web sajt sadrže materijale zaštićene copyright-om, zaštitne znakove i druge informacije o pravu vlasništva ili softver. Članovi mogu poslatu informacije zaštićene pravima vlasništva njihovih nosilaca i ona ostaju zaštićena bez obzira da li su oni koji prenose te informacije to naveli ili ne. Osim informacija koje su u javnom vlasništvu ili za koje dobijete dozvolu, nemate pravo da kopirate, modifikujete ili na bilo koji način menjate, objavljujete, prenosite, distribuirate, izvršavate, prikazujete ili prodajte bilo koju informaciju zaštićenu pravima vlasništva. Slanjem informacija ili sadržaja na bilo koji deo DevProTalk.com, Vi automatski dozvoljavate i predstavljate garanciju da imate pravo da dozvolite DevProTalk.com ili članovima DevProTalk.com bespovratnu, kontinualnu, neograničenu, globalnu dozvolu da koriste, kopiraju, izvršavaju, prikazuju i distribuiraju takve informacije i sadržaje i da iz takvih sadžaja koriste bilo koji deo u bilo koje svrhe, kao i pravo i dozvolu da koriste gore navedene sadržaje. Svi zaštitni znakovi (trademarks), logotipi, oznake usluga, firme ili imena proizvoda koji se pominju na ovom web sajtu su vlasništvo kojim raspolažu njihovi vlasnici.