DevProTalk

Forumi IT profesionalaca
web development, web design, e-business, SEO


Idite nazad   DevProTalk > Web development i web aplikacije > PHP
Želite da se reklamirate ekskluzivno na ovoj poziciji? Javite se

PHP PHP aplikacije, Smarty, PEAR

Odgovori
 
Alati teme Način prikaza
Staro 14. 11. 2008.   #1
nordica
novi član
 
Datum učlanjenja: 14.11.2008
Poruke: 4
Hvala: 0
0 "Hvala" u 0 poruka
nordica is on a distinguished road
Default static promenljiva koja drzi mysql resource, da ili ne?

Zelim da napisem neku svoju klasu za rad sa bazom, kao deo tronivojske arhitekture, i sad gledao sam dosta koda i knjiga i uglavnom se atribut klase koji drzi mysql resource (tj. rezultat mysql_connect funkcije) definise kao static.
Nije mi bas najjasnije zasto?
Zelim da otvorim vezu ka bazi kada hocu da izvrsim neki upit i odmah ga zatvaram.
Naime, ako u konstruktoru te svoje klase otvorim vezu ka bazi, a destruktoru klase zatvaram i kada koristim objekat te klase mi se pri samoj inicijalizaciji otvori veza, pa onda pozovem neku metodu da izvrsim upit i onda unistim taj objekat, ne kapiram zasto bi mi taj atribut bio static? Kapiram, ako je static, onda bi on, jednom kreiran postojao sve dok sam ne nestane na timeout u mysql-u? uopste koja je poenta? da li ce on, ako je static biti na raspolaganju vise korisnika?
nordica je offline   Odgovorite uz citat
Staro 14. 11. 2008.   #2
dinke
Super Moderator
Invented the damn thing
 
Avatar dinke
 
Datum učlanjenja: 06.06.2005
Poruke: 2.371
Hvala: 370
701 "Hvala" u 194 poruka
dinke je pravi dragi kamendinke je pravi dragi kamendinke je pravi dragi kamendinke je pravi dragi kamendinke je pravi dragi kamendinke je pravi dragi kamendinke je pravi dragi kamen
Default

Static promenljiva je zajednicka za sve instance jedne klase, tako da apsolutno ima smisla da promenljiva koja drzi mysql konekciju bude static. Posmatraj static promenljive recimo kao prezime svih clanova jedne porodice. Npr pera, mika i laza sharuju isto prezime petrovic i to je static promenljiva.

E sad sto se stvarnog zivota tice, ja uglavnom u svojim klasama kreiram instancu konekcije van neke klase koja je koristi i istu prosledjujem kroz konstruktor. Primer, mysql klasa koja je preuzeta od Harrya Fuecksa (ona je php4, za php5 koristi MySQLi klasu koja ima slicnu funkcionalnost):

PHP kôd:
<?php
/**
 * MySQL Database Connection Class
 * based on SPLIB by Harry Fueck
 * @access public
 */
class MySQL 
{
    
/**
     * MySQL server hostname
     * @access private
     * @var string
     */
    
var $host;

    
/**
     * MySQL username
     * @access private
     * @var string
     */
    
var $dbUser;

    
/**
     * MySQL user's password
     * @access private
     * @var string
     */
    
var $dbPass;

    
/**
     * Name of database to use
     * @access private
     * @var string
     */
    
var $dbName;

    
/**
     * MySQL Resource link identifier stored here
     * @access private
     * @var string
     */
    
var $dbConn;

    
/**
     * Stores error messages for connection errors
     * @access private
     * @var string
     */
    
var $connectError;

    
/**
     * MySQL constructor
     * @param string host (MySQL server hostname)
     * @param string dbUser (MySQL User Name)
     * @param string dbPass (MySQL User Password)
     * @param string dbName (Database to select)
     * @access public
     */
    
function MySQL ($host,$dbUser,$dbPass,$dbName
    {
        
$this->host=$host;
        
$this->dbUser=$dbUser;
        
$this->dbPass=$dbPass;
        
$this->dbName=$dbName;
        
$this->connectToDb();
    }

    
/**
     * Establishes connection to MySQL and selects a database
     * @return void
     * @access private
     */
    
function connectToDb()
    {
        
// Make connection to MySQL server
        
if (!$this->dbConn = @mysql_connect($this->host,$this->dbUser,$this->dbPass)) 
        {
            
trigger_error('Could not connect to server');
            
$this->connectError=true;
            
// Select database
        
}
        else if (!@
mysql_select_db($this->dbName,$this->dbConn) ) 
        {
            
trigger_error('Could not select database');
            
$this->connectError=true;
        }
    }

    
/**
     * Checks for MySQL errors
     * @return boolean
     * @access public
     */
    
function isError ()
    {
        if ( 
$this->connectError )
        {
            return 
true;
        }
        
$error=mysql_error ($this->dbConn);
        
        if ( empty (
$error) )
        {
            return 
false;
        }
        else
        {
            return 
true;
        }
    }

    
/**
     * Escape string that should be used in query
     * @param string
     * @return string
     * @access public
     */
    
function escapeString($string)
    {
        return 
mysql_real_escape_string($string,$this->dbConn);    
    }
    
    
/**
     * Returns an instance of MySQLResult to fetch rows with
     * @param $sql string the database query to run
     * @param bool [$ping], default false, pings mysql server
     * @return MySQLResult
     * @access public
     */
    
function & query($sql$ping false
    {
        if(
$ping)
        {
            
mysql_ping($this->dbConn);
        }
        
        if (!
$queryResource=mysql_query($sql,$this->dbConn))
        {
            
trigger_error ('Query failed: '.mysql_error($this->dbConn).' SQL: '.$sql);
        }
        
$result = &new MySQLResult($this,$queryResource);
        return 
$result;
    }
}

/**
* MySQLResult Data Fetching Class
* @access public
* @package SPLIB
*/
class MySQLResult
{
    
/**
     * Instance of MySQL providing database connection
     * @access private
     * @var MySQL
     */
    
var $mysql;

    
/**
     * Query resource
     * @access private
     * @var resource
     */
    
var $query;

    
/**
     * MySQLResult constructor
     * @param object mysql   (instance of MySQL class)
     * @param resource query (MySQL query resource)
     * @access public
     */
    
function MySQLResult(& $mysql,$query)
    {
        
$this->mysql=& $mysql;
        
$this->query=$query;
    }

    
/**
     * Fetches a row from the result
     * @return array
     * @access public
     */
    
function fetch ()
    {
        if ( 
$row=mysql_fetch_array($this->query,MYSQL_ASSOC) )
        {
            return 
$row;
        }
        else if ( 
$this->size() > )
        {
            
mysql_data_seek($this->query,0);
            return 
false;
        }
        else
        {
            return 
false;
        }
    }

    
/**
     * Returns the number of rows selected
     * @return int
     * @access public
     */
    
function size () 
    {
        return 
mysql_num_rows($this->query);
    }
    

    
/**
    * Returns the number of affected rows
    * @return int affected 
    * @access public
    */
    
function rowsAffected () 
    {
        return 
mysql_affected_rows($this->mysql->dbConn);
    }


    
/**
    * Returns the ID of the last row inserted
    * @return int
    * @access public
    */
    
function insertID () {
        return 
mysql_insert_id($this->mysql->dbConn);
    }
    
    
/**
     * Checks for MySQL errors
     * @return boolean
     * @access public
     */
    
function isError () 
    {
        return 
$this->mysql->isError();
    }
}
?>
A onda u nekoj svojoj klasi mozes imati nesto ovako:
PHP kôd:
class Moja_Klasa
{

    
/**
     * Instance of MySQL class
     * @access private
     * @var MySQL
     */
    
public static db;

    function 
__construct($db)
    {
        
$this->db $db;
    }    
}

//usage
$db = new MySQL(...);
$myClass = new Moja_Klasa($db); 
Ili instancu MySQL klase kreiras u samom konstuktoru, ali to radis onda kada nije potrebno da van te klase postoji nijedna DB konekcija.

PHP kôd:
class Moja_Klasa
{

    
/**
     * Instance of MySQL class
     * @access private
     * @var MySQL
     */
    
public static db;

    function 
__construct()
    {
        
$db = new MySQL(...);
        
$this->db $db;
    }    
}

//usage
$myClass = new Moja_Klasa(); 
Inace sto se terminologije tice (koliko se secam) prvi primer se zove agregacija (prenosis postojecu klasu drugoj na koriscenje kroz konstuktor) a drugi kompozicija (kreiras instancu potrebne klase unutar same klase, najcesce u konstuktoru).

Nadam se da sam bio od pomoci
__________________
Caught in a Web|Blogodak
With great power comes great responsibility!

Poslednja izmena od dinke : 14. 11. 2008. u 14:38.
dinke je offline   Odgovorite uz citat
Staro 14. 11. 2008.   #3
centaur
Ivan Pavković
Qualified
 
Avatar centaur
 
Datum učlanjenja: 15.01.2007
Lokacija: Beograd
Poruke: 144
Hvala: 42
16 "Hvala" u 16 poruka
centaur is on a distinguished road
Default

Evo da probam da dam svoje vidjenje toga.

Pre svega, ne moras toliko da se opterecujes zatvarnjem konekcije ka bazi.
Konekcija ce biti zatvorena kada se skripta izvrsi, tako da nije neophodno da o tome vodis racuna.
Ja licno ne zatvaram konekciju ka bazi nikad, pustam PHP engine da vodi racuna o tome.

Zasto static?
Kada definises neki propery kao static, to znaci da ce on biti deljen izmedju svih instanci te klase, sto je klasu koju ti hoces svakako pozeljno.
Dodao bih jos da je za db klasu veoma pozeljno koristiti singleton pattern koji ce ti omoguciti da uvek imas jednu i samo jednu instancu iste klase.
centaur je offline   Odgovorite uz citat
Staro 14. 11. 2008.   #4
bluesman
Goran Pilipović
Sir Write-a-Lot
 
Avatar bluesman
 
Datum učlanjenja: 18.05.2005
Lokacija: Beograd
Poruke: 5.450
Hvala: 288
1.247 "Hvala" u 446 poruka
bluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušati
Pošaljite ICQ poruku za bluesman
Default

I ja sam jedno vreme tako radio, osim sto sam prenosio $db kao referencu, a onda sam napravio pure static klasu DB i umesto

$result = $this->db->fetch (...)

sada uvek radim $result = DB::fetch(...)

Jednostavno ne vidim nikakvu potrebu da postoji $this->db u svakom objektu, to su sve bila nasledja iz starih vremena php4 (pa cak i php3)

A sto se tice static promenljive koja drzi mysql resource... iskreno ne znam zasto to tako "treba", jer nikada do sada nisam imapo potrebu da pristupam varijabli (mysql resource) koju mysql vraca... uvek mi trebaju samo rezultati, a moja DB klasa brine o tome, pa kada uraidm fetch() vraca rezultate a ne resource. Taj resource je potreban samo interno u toj klasi, a posto je i klasa static, sigurno se nece inicijalizovati 20 puta.
__________________
Goran Pilipović a.k.a. Ugly Fingers Bradley f.k.a. bluesman
I don't always know what I'm talking about but I know I'm right!
bluesman je offline   Odgovorite uz citat
Staro 14. 11. 2008.   #5
ivanhoe
Ivan Dilber
Sir Write-a-Lot
 
Avatar ivanhoe
 
Datum učlanjenja: 18.10.2005
Lokacija: Bgd
Poruke: 5.320
Hvala: 104
2.344 "Hvala" u 583 poruka
ivanhoe je ime poznato svimaivanhoe je ime poznato svimaivanhoe je ime poznato svimaivanhoe je ime poznato svimaivanhoe je ime poznato svimaivanhoe je ime poznato svimaivanhoe je ime poznato svimaivanhoe je ime poznato svimaivanhoe je ime poznato svimaivanhoe je ime poznato svimaivanhoe je ime poznato svima
Pošaljite poruku preko Skype™ za ivanhoe
Default

problem sa static promenjivom je sto u jednom trenutku pozelis da se zakacis na 2 baze odjednom (load balancing ili sta vec), a ako konekciju cuvas kao static to ne mozes jednostavno izvesti... cim je promenis u jednoj instanci, menjas je svugde..

zato ja preferiram da mi svaka instanca ima svoju referencu na DB link, a php driveri su tako napravljeni da ce koristiti postojece konekcije ako mogu, tako da je prakticna razlika samo u jednom integeru vise po klasi sto je beznacajno u odnosu na dodatnu flexibilnost u radu sa vise baza...
__________________
Leadership is the art of getting people to want to do what you know must be done.
ivanhoe je offline   Odgovorite uz citat
Staro 14. 11. 2008.   #6
nordica
novi član
 
Datum učlanjenja: 14.11.2008
Poruke: 4
Hvala: 0
0 "Hvala" u 0 poruka
nordica is on a distinguished road
Default

Citat:
Originalno napisao ivanhoe Pogledajte poruku
problem sa static promenjivom je sto u jednom trenutku pozelis da se zakacis na 2 baze odjednom (load balancing ili sta vec), a ako konekciju cuvas kao static to ne mozes jednostavno izvesti... cim je promenis u jednoj instanci, menjas je svugde..

zato ja preferiram da mi svaka instanca ima svoju referencu na DB link, a php driveri su tako napravljeni da ce koristiti postojece konekcije ako mogu, tako da je prakticna razlika samo u jednom integeru vise po klasi sto je beznacajno u odnosu na dodatnu flexibilnost u radu sa vise baza...
znaci ti imas klasu koja nije staticka, atribut koji drzi mysql resource u okviru nje, koji takodje nije staticki i metodu kojom dodeljujes vrednost tom atributu koja je staticka? tako nekako?

ja kapiram sta znaci static, ali me buni jedna druga stvar. nadam se da pitanje nije previse glupo
znaci ako je static ta klasa ili, svjedno, link ka bazi, da li onda jednom kada se taj link kreira on vazi za mene koji sam pokrenuo ceo taj skript, i nekog drugog ko je dosao na sajt i isto tako pokrenuo taj skript ili svako ima svoj primerak?
nordica je offline   Odgovorite uz citat
Staro 14. 11. 2008.   #7
kodi
133t
Master
 
Avatar kodi
 
Datum učlanjenja: 08.01.2006
Lokacija: Beograd
Poruke: 714
Hvala: 16
37 "Hvala" u 28 poruka
kodi is on a distinguished road
Pošaljite ICQ poruku za kodi
Default

svako svoj primerak.
__________________
kodi je offline   Odgovorite uz citat
Staro 15. 11. 2008.   #8
ivanhoe
Ivan Dilber
Sir Write-a-Lot
 
Avatar ivanhoe
 
Datum učlanjenja: 18.10.2005
Lokacija: Bgd
Poruke: 5.320
Hvala: 104
2.344 "Hvala" u 583 poruka
ivanhoe je ime poznato svimaivanhoe je ime poznato svimaivanhoe je ime poznato svimaivanhoe je ime poznato svimaivanhoe je ime poznato svimaivanhoe je ime poznato svimaivanhoe je ime poznato svimaivanhoe je ime poznato svimaivanhoe je ime poznato svimaivanhoe je ime poznato svimaivanhoe je ime poznato svima
Pošaljite poruku preko Skype™ za ivanhoe
Default

u PHP-u svaki poziv skripte ima svoj proces koji je potpuno nezavistan od svega ostalog. Znaci cela prica o static variablama se odnosi samo na stvari unutar tog procesa, a svaki proces ce imati zasebnu kopiju svih varijabli, klasa i svega ostalog.
U nekim drugim jezicima/okruzenjima je to drugacije reseno, ovde je tako...

Inace moja DB klasa koju sam pominjao nema nista staticko, radi sa najobicnijim php4 klasama, vrlo jednostavan OOP. Napravis instancu klase sa new, i to je jedna konekcija na jednu bazu. Onda mozes da napravis drugu konekciju i ona moze da bude vezana na skroz drugu bazu, metode su iste, ali svaka instanca zna svoj link na bazu, i to je cela mudrost.
__________________
Leadership is the art of getting people to want to do what you know must be done.

Poslednja izmena od ivanhoe : 15. 11. 2008. u 06:02.
ivanhoe je offline   Odgovorite uz citat
Odgovori


Alati teme
Način prikaza

Pravila pisanja
Možete ne započinjati nove teme
Možete ne slati odgovore
Možete ne slati priloge
Možete ne izmeniti svoje poruke
vB kôd je Uključen
Smajliji su Uključen
[IMG] kod je Uključen
HTML kôd je Isključen
Pogledajte forum

Slične teme
Tema Početna poruka teme Forum Odgovori Poslednja poruka
Koja banka za preduzetnika? mLAN e-Business 68 02. 02. 2011. 13:22
Promenljiva u html formi chandler Sva početnička pitanja 2 30. 01. 2009. 12:21
da li floatujete ili pozicionirate (static/relative) darche Sva početnička pitanja 19 25. 10. 2007. 02:11
Globalna promenljiva uz prototype framework LiquidBrain (X)HTML, JavaScript, DHTML, XML, CSS 7 23. 08. 2007. 16:24
Web-Dev Resource Br@nkoR Linkovi 5 10. 06. 2005. 00:58


Vreme je GMT +2. Trenutno vreme je 04:45.


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.