Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 25

Discussione: OOP Mysqli e classi

  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2013
    Messaggi
    158

    OOP Mysqli e classi

    Ciao a tutti!
    Sono nuovo per quanto riguarda la OOP in PHP.
    Volevo aprire una discussione per capire quale sia il metodo migliore per utilizzare i metodi messi a disposione dalla classe mysqli.

    Come fare ad utilizzarli in classi che non comunicano fra di loro?

    - si deve inserire nel metodo __construct di ogni classe il seguente codice per ogni classe?

    codice:
    class a {
    
        private $mysqli;
    
        function __construct() {
        
             $this->mysqli = new mysqli(bla,bla,bla,bla);
        }
    
    }
    
    class b {
    
        private $mysqli;
    
        function __construct() {
        
             $this->mysqli = new mysqli(bla,bla,bla,bla);
        }
    
    }
    Oppure si scrive una classe personalizzata mysqli che estenderà tutte le altre classi?

    Grazie mille in anticipo per le vostre considerazioni

  2. #2
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Il metodo __construct viene richiamato quando l'istanza dell'oggetto viene creata. Quindi è il posto migliore per inizializzare tutte le cose che saranno utili sin dall'inizio.

    Se i metodi del tuo oggetto utilizzano mysql è lecito "inizializzare" la connessione al db sin dalla creazione dell'oggetto. Ma immaginiamo che tu abbia solo un paio di metodi tra tanti che usano mysql. Forse non conviene creare la connessione se mysql non verrà usato. In questo caso potresti avere un flag che ne gestisce la connessione.

    Codice PHP:
    class {
        private 
    $mysqli;
        private 
    $flagdb;
        function 
    __construct() {         
          
    $this->flagdb false;   
        }

        private function 
    connessione() {
             
    $this->flagdb true;         
             
    $this->mysqli = new mysqli(bla,bla,bla,bla);   
        }

        function 
    leggere_tabella() {
           if (! 
    $this->flagdb) {$this->connessione();}
           
    $qurey "select * from tabella";
           
    etc...
        }

    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2013
    Messaggi
    158
    Ma se voglio utilizzare i metodi mysqli in classi diverse e distinte?
    Per usare i metodi dovrei istanziare l oggetto mysqli in ogni classe.... Oppure ?

  4. #4
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Si e no. Ricordati sempre della portata delle variabili. In un metodo puoi utilizzare una variabile locale ad una funzione par istanziare mysql.

    Codice PHP:
    function pippo() {
     
    $x = new mysqli(bla,bla,bla,bla);   
     
    $x->mysqli_query(.....);

    Ma siccome $x è un'istanza locale di mysqli nella funzione pippo non è visibile dagli altri metodi. Allora se poi vuoi eseguire un'altra query in un altro metodo, devi creare un'altra istanza di mysql.

    Codice PHP:
    function pippo() { 
     
    $x = new mysqli(bla,bla,bla,bla);    
     
    $x->mysqli_query(.....);
    }

    function 
    pluto() { 
     
    $y = new mysqli(bla,bla,bla,bla);    
     
    $y->mysqli_query(.....);


    Ma se voglio utilizzare i metodi mysqli in classi diverse e distinte?
    Non capisco quello che intendi.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2013
    Messaggi
    158
    esatto! quindi va istanziato l'oggetto in ogni classe/funzione dove voglio usare i metodi mysqli.

    Quindi non è possibile una cosa del genere:
    codice:
    class a {
        private $mysqli;
        private $query;
       
        public function __construct(){
              $this->mysqli = new mysqli(boa,bla,bla,bla);
        }
    
        public function pippo($query){
              $this->query=$this->mysqli->query($query);
        }
    }
    
    // la classe a è ok
    
    // se ho capito bene la classe b contiene un errore
    
    class b {
    
        private $sql;
    
        public function pluto(){
             
              // non può funzionare perche nella classe b non è i stanziato l'oggetto mysqli giusto?
              $this->sql = $this->mysqli->query("SELECT * FROM tab");
    
             // se fosse cosi invece funzionerebbe?
            $this->sql = mysqli_query("SELECT * FROM tab");
    
        }
    
    }
    Quindi ricapitolando... per classi distinte va istanziato l'oggetto della classe mysqli (possibilmente nel __construct della classe) in ogni classe per poter utilizzare i metodi all'interno della classe...

  6. #6
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    La class b contiene 2 errori. Il primo è la mancanza della creazione dell'istanza come hai indicato. Il. secondo è che utilizzato in maniera procedurale, mysqli_query ha bisogno del parametro "connessione".

    Codice PHP:
    class {

     function 
    pluto() {
      
    $link mysqli_connect("localhost""my_user""my_password""world");  
      
    $this->sql mysqli_query($link,"SELECT * FROM tab");
     }



    oppure

    Codice PHP:
    class 
      private 
    $link;

     function 
    __construct() {
      
    $link mysqli_connect("localhost""my_user""my_password""world");
     }

     function 
    pluto() {  
      
    $this->sql mysqli_query($link,"SELECT * FROM tab"); 
     }


    Vedi la differenza ? Nel primo caso la query puo' essere eseguita soltanto da pippo(). Dovresti creare un'altra connessione si tu dovessi fare un'altra query in un altro metodo.
    Nel secondo caso si potrebbe eseguire una query da un altro metodo senza dover creare una nuova connessione.

    In maniera OOP mysqli non ha bisogno di tramandare la connessione. Essa è una "variabile" visibile e utilizzabile da tutti i metodi dell'oggetto mysqli, un po' come $link nell'esempio di sopra. Quindi si potrebbe ipotizzare che l'oggetto mysqli è stato creato usando mysqli procedurale.

    Codice PHP:

    class mysqli {

    private 
    $link;

     function 
    __construct($host,$user,$password,$dbname) {  
      
    $link mysqli_connect($host,$user,$password,$dbname); 
      ....
     }

     function 
    query($string) {
      return 
    mysqli_query($link,$string);
     }


    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2013
    Messaggi
    158
    Giusto!
    Ma secondo te è più giusto usare il modo procedurale oppure l oggetto istanziandolo come abbiamo visto?
    C è per capire il senso è la ratio della cosa... Per approcciarmi in modo corretto alla oop

  8. #8
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Non ho nessuna religione a questo proposito. In generale, avrei tendenza a preferire il modo procedurale perche più semplice e valevole nel 90% dei casi. Pero' in questi giorni mi sto facendo un motore di templates e non mi è mai venuto in mente di farlo senno' in OOP.
    Direi che se ti rendi conto che alcune tue funzioni hanno bisogno di comunicare tra di loro e che non vuoi avere una marea di parametri allora hai bisogno dell'OOP.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  9. #9
    ma il vostro (bla,bla,bla,bla) (parametri di connessione del db) come ce lo inserite?? e se dovesse cambiare, lo riscrivete su tutte le classi?

    non mi sembra molto riusabile
    Questa volta, più che un voto.. è favoreggiamento.

  10. #10
    Utente di HTML.it
    Registrato dal
    Jun 2013
    Messaggi
    158
    Nono... Era solo un modo per non scrivere codice in più... E porre l attenzione su altro...

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.