Pogledajte određenu poruku
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 13:38.
dinke je offline   Odgovorite uz citat