Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di Ironmax
    Registrato dal
    Dec 2008
    Messaggi
    1,026

    Recuperare il valore della classe

    Salve a tutti.
    Mi sto approciando da poco nel mondo della programmazione orientata agli oggetti.
    Volevo capire come posso fare a recuperare il valore di ritorno della funzione connetti():
    codice:
    class MysqlClass
    {
      // parametri per la connessione al database
      private $nomehost = "localhost";    
      private $nomeuser = "root";         
      private $password = "";
              
      // controllo sulle connessioni attive
      private $attiva = false;
     
      // funzione per la connessione a MySQL
      public function connetti()
      {
       if(!$this->attiva)
       {
        $connessione = mysql_connect($this->nomehost,$this->nomeuser,$this->password);
           }else{
            return true;
           }
        }
    }
    In modo da dare un significato ben preciso se non avviene la connessione, in questo caso al host.
    Grazie.

  2. #2
    Utente di HTML.it L'avatar di Grino
    Registrato dal
    Oct 2004
    Messaggi
    739
    Premettendo che questa è una classe poco meno che didattica

    Codice PHP:
    <?php
    class MysqlClass
    {
        const 
    kConnessioneFallita=0;
        const 
    kConnessioneStabilita=1;
        const 
    kConnessioneEsistente=2;
        
        
    // parametri per la connessione al database
        
    private $nomehost "localhost";    
        private 
    $nomeuser "root";         
        private 
    $password "";
              
        
    // controllo sulle connessioni attive
        
    private $connessione false;
        
        
    // funzione per la connessione a MySQL
        
    public function connetti(){
            if(
    $this->connessione===false){
                if(
    $this->connessione mysql_connect($this->nomehost,$this->nomeuser,$this->password))
                    return 
    self::kConnessioneStabilita;
                else 
                    return 
    self::kConnessioneFallita;
            
            return 
    self::kConnessioneEsistente;
        }


    ?>
    L'utilizzatore dell'oggetto potrà sapere esattamente cosa succede confrontando il valore di ritorno con le costanti accessibili come

    MysqlClass::kConnessioneFallita
    MysqlClass::kConnessioneStabilita
    MysqlClass::kConnessioneEsistente

    in più, dato che utilizzamo la costante 0 per il fallimento della connessione l'utilizzatore potrà semplicemente scrivere
    Codice PHP:
    if($obj->connetti()){
    //tutto bene
    }else{
    //non c'è connesisone al DB

    Siamo sempre troppo gelosi delle nostre grandi piccole opere! - Grino inedito.
    Lavori e Lavoretti

  3. #3
    Utente di HTML.it L'avatar di Grino
    Registrato dal
    Oct 2004
    Messaggi
    739
    Un po' più oggettosa
    Codice PHP:
    <?php
    class MysqlClass
    {
        
    //const kConnessioneFallita=0;
        
    const kConnessioneStabilita=1;
        const 
    kConnessioneEsistente=2;
        
        
    // parametri per la connessione al database
        
    private $nomehost "localhost";    
        private 
    $nomeuser "root";         
        private 
    $password "";
              
        
    // controllo sulle connessioni attive
        
    private $connessione null;
        
        
    // funzione per la connessione a MySQL
        
    public function connetti(){
            if(
    is_null($this->connessione){
                if(
    $this->connessione mysql_connect($this->nomehost,$this->nomeuser,$this->password))
                    return 
    self::kConnessioneStabilita;
                else 
                    throw new 
    Exception(mysql_error(),mysql_errno());
            
            return 
    self::kConnessioneEsistente;
        }


    ...
    try{
        
    $obj->connetti();
        
    //altre operazioni sul DB
    }catch (Exception $e) {
        echo 
    "C'è sato un problema con il DB:".$e->getCode()." --> ".$e->getMessage();
    }
    ...
    ?>
    in questo modo getCode ti da il codice di errore di mysql e get message il messaggio relativo. Più di così?
    Siamo sempre troppo gelosi delle nostre grandi piccole opere! - Grino inedito.
    Lavori e Lavoretti

  4. #4
    Utente di HTML.it L'avatar di Ironmax
    Registrato dal
    Dec 2008
    Messaggi
    1,026
    Grazie Grino. Il tuo codice mi è stato d'aiuto per capire meglio come gestire il collegamento con l'host.
    Volevo solo capire se anche per il collegamento al database utilizzi una classe a parte, oppure lo gestisci con la funzione nativa all'interno della stessa classe del collegamento all'host tipo questo codice:
    codice:
    codice:
    public function connettiDatabase(){
    		if(is_null($this->connessione)){
    			if($this->db_select = mysql_select_db($db_database,connetti())){
    				return self::kConnessioneStabilita;
    			 else
    				throw new Exception(mysql_error(),mysql_errno());
    				return self::kConnessioneEsistente;
    			}
    				
    		}
    	}
    Solo che non mi funziona correttemente questa funzione che ho scritto.

  5. #5
    Utente di HTML.it L'avatar di Ironmax
    Registrato dal
    Dec 2008
    Messaggi
    1,026
    Mentre nel lato di esecuzione classe ho scritto questo:
    codice:
    try{
        $oggettoConnessione->connettiDatabase();
        //altre operazioni sul DB
    }catch (Exception $e) {
        echo "C'è stato un problema con il DB";
    }
    Ho solo cambiato il nome dell'oggetto da $obj a $oggettoConnessione

  6. #6
    Utente di HTML.it L'avatar di Grino
    Registrato dal
    Oct 2004
    Messaggi
    739
    Scusa, il 2° codice ha un errore nell'if. Ovveorisia il $this->connessione va confrontato con false (la funzione is_null non va bene), che è il valore restituito dal mysql_connect in caso di errore.

    Nel momento in cui un metodo solleva una eccezione con throw creando un oggetto di classe Excaption o sua sottoclasse, l'esecuzione del metodo termina e il controllo nel chiamante viene passato al ramo catch del construtto try/catch

    Per maggiori dettagli dai una lettura al manuale e all'estenzione delle eccezioni

    Per ulteriori osservazioni postami tutto il codice della classe come lo hai scritto e non solo un metodo che mi dice poco.

    Ciao
    Siamo sempre troppo gelosi delle nostre grandi piccole opere! - Grino inedito.
    Lavori e Lavoretti

  7. #7
    Utente di HTML.it L'avatar di Ironmax
    Registrato dal
    Dec 2008
    Messaggi
    1,026
    Ciao Grino, questo è il codice di tutta la classe:
    codice:
    class MysqlClass
    {
        //const kConnessioneFallita=0;
        const kConnessioneStabilita=1;
        const kConnessioneEsistente=2;
        
        // parametri per la connessione al database
        private $nomehost = "localhost";    
        private $nomeuser = "root";         
        private $password = "";
    	private $db_database = "oggetto";
    	
        // controllo sulle connessioni attive
        private $connessione = null;
        
        // funzione per la connessione a MySQL
        public function connetti(){
            if(is_null($this->connessione)){
                if($this->connessione = mysql_connect($this->nomehost,$this->nomeuser,$this->password))
                    return self::kConnessioneStabilita;
                else 
                    throw new Exception(mysql_error(),mysql_errno());
            
            return self::kConnessioneEsistente;
    		}
    	}
    	
    	public function connettiDatabase(){
    		if($this->connessione == false){
    			if($this->db_select = mysql_select_db($db_database,connetti())){
    				return self::kConnessioneStabilita;
    			 else
    				throw new Exception(mysql_error(),mysql_errno());
    				return self::kConnessioneEsistente;
    			}
    				
    		}
    	}
    }

  8. #8
    Utente di HTML.it L'avatar di Ironmax
    Registrato dal
    Dec 2008
    Messaggi
    1,026
    Scusa Grino.
    Volevo capire perchè, dato che non mi è mai capitato, ci sono tre gradi di connessione:
    const kConnessioneFallita=0;
    const kConnessioneStabilita=1;
    const kConnessioneEsistente=2;
    O almeno in programmazione strutturata si apriva la connessione ed alla fine della query o delle query si chiudeva la connessione.

    Poi perchè le seguenti proprietà sono private? Non era meglio statiche?
    private $nomehost = "localhost";
    private $nomeuser = "root";
    private $password = "";
    Grazie.

  9. #9
    Utente di HTML.it L'avatar di Grino
    Registrato dal
    Oct 2004
    Messaggi
    739
    Originariamente inviato da Ironmax
    Scusa Grino.
    Volevo capire perchè, dato che non mi è mai capitato, ci sono tre gradi di connessione:
    const kConnessioneFallita=0;
    const kConnessioneStabilita=1;
    const kConnessioneEsistente=2;
    O almeno in programmazione strutturata si apriva la connessione ed alla fine della query o delle query si chiudeva la connessione.

    Poi perchè le seguenti proprietà sono private? Non era meglio statiche?
    private $nomehost = "localhost";
    private $nomeuser = "root";
    private $password = "";
    Grazie.
    Quando stabilisci una connessione ad un DB MySQL ti viene fornito il famoso $conn che è un id di risorsa (un numero intero per capirci) se richiami la mysql_connect per la seconda volta MySQL si accorge che sei sempre tu e restituisce lo stesso ID.

    Se dall'oggetto invochi per due volte lo stesso metodo di connessione, essendo già settato l'attributo della connessione, possiamo dire che la connessione è esistente "già". In teoria potresti ritenere errato che venga invocato più di una volta e quindi voler sapere se il tuo codice contiene più chiamate al metodo di connessione (ma è giusto teoria). Se $connessione è false, allora cerchiamo di ottenere il nostro resource ID. Se va male la mysql_connect ritorna false (ecco perchè ho sbagliato nel secondo esempio ad usare is_null) quindi possiamo comunicare, o con un valore di ritorno o sollevando una eccezione, che il tentativo di stabilire una connessione con mysql non è andato a buon fine.
    Se attraversiamo indenni i primi due casi, allora abbiamo ottenuto una nuova risorsa id, quindi comunichiamo che è andato tutto ok.

    L'unico attributo veramente statico in questa classe "giocattolo" dovrebbe essere $connessione, perchè l'id che utilizziamo e che comunque mysql ritorna alle nostre richieste di connessione è sempre lo stesso a prescindere dall'oggetto/procedura che lo richiede.

    In linea di principio tutti i dati interni, contenuti in attributi della classe, non vanno esposti ma piuttosto va consentito loro un accesso tramite metodi set/get. In tal caso potremo parlare di proprietà. Con PHP hai i metodi magici __set e __get che vengono invocati quando il client tenta di acceder tramite un oggetto ad una proprietà non definita. Questo ti permette una migliore gestione e maggior controllo su ciò che il client cerca di fare piuttosto che rendere pubblici degli attributi.

    I modificatori di accesso sono Private, Public, Protected. Il modifcatore static indica invece che un dato attributo o metodo non appartiene ad una singola istanza della classe, ma alla classe stessa. Gli attributi statici risultano condivisi fra le classi, mentre i metodi possono essere invocati senza istanziare alcun oggetto ma anteponendo direttamente il nome della classe: nomeclasse::nomemetodostati();

    Infine, come gestire gli attributi o degli aglgomerati di dati correlati fra di loro, sono scelte di progetto. Potresti per esempio decidere di far viaggiare i dati host, user e password, attraverso un oggetto di trasporto utilizzato dalla classe del db e che lo richiede come argomento al momento della costruzione o settabile tramite metodo... per esempio

    Codice PHP:
    <?php
    /*
     * Esempio di classi per un DB
     */

    class cExceptionClasseTrasporto extends Exception{
        const 
    kErroreInatteso=0;
        const 
    kProprietaDuplicata=1;
        const 
    kProprietaInesistente=2;
        
        private 
    $messaggi=array(
                    
    "Errore Inatteso;",
                    
    "Tentativo di duplicazione della proprietà: ",
                    
    "Si tenta di gestire un proprietà inesistente: "
                
    );
        public function 
    __construct($codice,$nomeProprieta) {
            
    parent::__construct($this->messaggi[$codice].$nomeProprieta$codice);
        }
    }

    abstract class 
    cClasseTrasporto{
        private 
    $data=array();
        
        protected function 
    ProprietaEsistente($nome){
            return 
    array_key_exists($nome$this->data);
        }
        
        protected function 
    AggiungiProprietà($nome,$valoreDefault){
            if(!isset(
    $data['$nome']))
                
    $this->data[$nome]=$valoreDefault;
            else
                throw new 
    cExceptionClasseTrasporto(cExceptionClasseTrasporto::kProprietaDuplicata,$nome);
        }
        
        protected function 
    RimuoviProprietà($nome){
            if(
    $this->ProprietaEsistente($nome))
                unset(
    $this->data['$nome']);
            else
                throw new 
    cExceptionClasseTrasporto (cExceptionClasseTrasporto::kProprietaInesistente$nome);
        }
        
        public function 
    __set($nome$valore) {
            if(
    $this->ProprietaEsistente($nome))
                
    $this->data[$nome]=$valore;
            else
                throw new 
    cExceptionClasseTrasporto (cExceptionClasseTrasporto::kProprietaInesistente$nome);
        }
        
        public function 
    __get($nome) {
            if(
    $this->ProprietaEsistente($nome))
                return 
    $this->data[$nome];
            else
                throw new 
    cExceptionClasseTrasporto (cExceptionClasseTrasporto::kProprietaInesistente$nome);
        }
    }

    class 
    cCTParametriConnessione extends cClasseTrasporto{
        public function 
    __construct() {
            
    $this->AggiungiProprietà("user""root");
            
    $this->AggiungiProprietà("password""");
            
    $this->AggiungiProprietà("host""localhost");
        }
        
        
    //posso definire altri metodi per il settaggio dei singoli parametri,
        //oppure definire un metodo per il pssaggio dei parametri nella
        //forma user@host:passwor, sarà poi il metodo a distribuire i
        //valori. Ancora il client può impostare i valori accedendo 
        //direttamente alle proprietà con $obj->user="pippo"

        //posso ridefinire __set e __get per effettuare ulteriori controlli
        //prima di invocare il metodo parent::__set o parent::__get 
        //perchè memorizzi i dati per me
    }

    abstract class 
    GenericDB{
        private 
    $parametriConnessione=null;
        
        public function 
    __construct($oCTParametriConnessione){
            
    //controllo che l'oggetto sia di classe attesa e lo assegno all'attributo
        
    }
        public function 
    Connetti(){
            
    //questa funzione resta vuota e poi la specifica implementazione andrà a
            //colamre i vuoit, dopotutto è una classe astratta
        
    }
        
    //e via così....
    }

    //e ancora e ancora...
    ?>
    Siamo sempre troppo gelosi delle nostre grandi piccole opere! - Grino inedito.
    Lavori e Lavoretti

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.