Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    208

    Problema di logica con le variabili tra classi

    Allora, il mio nuovo problema abbastanza stupido (ma mi mancano dei passaggi logici a volte) è una variabile che non passa come vorrei che facesse.

    Per prima cosa la classe che gestisce la connessione al db:

    Codice PHP:
    class connessionedb {


      
    // parametri per la connessione al database
      
    private $nomehost "localhost";     
      private 
    $nomeuser "user";          
      private 
    $password "pass"
      private 
    $database "db";
      public 
    $connetti;
      
      
    // funzione per la connessione a MySQL
      
    public function __construct() {
           
    $connetti = new mysqli($this->nomehost,$this->nomeuser,$this->password$this->database);
                if (
    $connetti->connect_errno) {
        echo 
    "Failed to connect to MySQL: " $connetti->connect_error;
            } else {
                return 
    $connetti;
            }
        }
      } 
    come si vede in ultimo, il construct di questa classe ritorna una $connetti.

    A questo punto ho un'altra classe abbastanza grande, la quale fa una serie di operazioni che vanno a buon fine, fino al metodo InsertDb che riporto sotto. Chiamo la connessione (nell'implementazione che non ho riportato poichè non si giustifica a dovere come testo e sarebbe complicata da leggere) e poi parte il metodo, il quale però rileva $connetti con undefined variable.

    Codice PHP:
    public function InsertDB() {
            
    $query "INSERT into tabella (old_id,                                  VALUES                 ($this->old_id)";        $this->inserisci mysqli_query($connetti$query);        if (!$this->inserisci) {            die('Error:' mysqli_error($connetti));        } else {            return $this->inserito true;        }    } 
    Le domande sono 3:

    1) Perchè nonostante il return, $connetti non è definita?
    2) In linea più generale, qual'è il sistema giusto per passare una variabile da un'istanza e poi richiamarla in una funzione successiva? (che è un pò quello che faceva in procedurale il comando global)
    3) E' logicamente giusto separare la connessione in una classe diversa da quella della query o dovrebbero (sempre per logica) far parte entrambe di una stessa classe? E in questo secondo caso, come passo l'array da inserire (più o meno la stessa domanda del punto 2)?

    Grazie mille e chiedo ancora scusa per questi dubbi un pò così, ma ci sono veramente dei passaggi che o te li spiega chi ha esperienza, o probabilmente nessun manuale nè spiegazione scritta riporta a dovere.
    Ultima modifica di Korenaar; 04-03-2014 a 19:10

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,448
    Perché $connetti non è una variabile globale e la funzione non la vede.
    Per fargliela vedere gliela devi passare come parametro

    public function InsertDB($conn) //chiamata $conn solo per farti capire che non è la variabile $connessione, ma un suo riferimento.

    da chiamare con
    InsertDb($connessione)

    ammesso che, da dove la chiami, $connessione sia visibile.

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    208
    No aspetta...mi sono perso un attimo.

    1) return $connetti e qui ci siamo.
    2)public function InsertDb($connetti) nella dichiarazione del metodo?

    implemento (nel passaggio specifico) così?:

    Codice PHP:
    $insert = new connessionedb();    
                        
    $insert->connetti();
                        
    $form->InsertDB($connetti); 
                        
    //$form è la variabile d'istanza della megaclasse di cui sopra 
    Immagino di no perchè continua a non funzionare. Ma se è tecnicamente giusto, c'è qualche altro problema.

  4. #4
    La logica è sbagliata. In un oggetto esistono proprio per questi casi gli attributi delle classi: per accedere a valori "interni" senza che dall'esterno di sappia come funziona l'oggetto.

    Crea una classe sola "GestioneDB" e lascia stare il "public $connetti", tienila privata così puoi accederci come
    Codice PHP:
    $this->connetti 
    in qualsiasi altro metodo.

    Ad esempio:
    Codice PHP:
    public function InsertDB() {
      
    $query "INSERT into blah blah";
      
    $this->inserisci mysqli_query($this->connetti$query);


    Tutto ciò detto, due cose:
    1. ma perchè non usi un PDO e te lo stai rifacendo (male) da zero? http://it1.php.net/pdo
    2. occhio, Occhio, OCCHIO a quello che metti dentro le query!

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    208
    Tutto chiaro questo. Il punto è che sto trovando un pò di difficoltà a capire come giri il fumo di alcune cose (immagino abbastanza scontate) riguardo le variabili. Non tanto il concetto di protected e private che mi è assolutamente chiaro, quanto il come rendere accessibili questi valori al di fuori di un'istanza già eseguita senza che questa risulti undefined.

    Mi spiego meglio.

    Ipotizziamo di avere una classe "A" con il solo construct che definisce $a e lo returna all'esterno.
    Ipotizziamo di avere una classe "B" con il solo construct che definisce $b e lo returna all'esterno.

    Immaginiamo di voler sommare queste due variabili in un implementazione (so che si usano metodi interni all'una o all'altra classe per fare questo, ma l'esempio mi è strumentale) che semplicemente istanzi le due classi e le sommi. Perchè le variabili returnate mi tornano puntualmente undefined se gestite all'esterno delle due classi e dopo averle istanziate?

    Mi serve per capire come girano le variabili questa cosa. So che l'esempio fatto a parole è formalmente scorretto, ma visto che sto notando che capita spesso di gestire il passaggio di dati da un'istanza all'altra senza che le varie classi abbiano motivo di essere imparentate, vorrei capire effettivamente come gestire il passaggio dei dati. Di fatto (per tornare all'esempio originario che mi ha fatto aprire il topic) una classe d'inserimento DB non ha motivo di essere imparentata con una classe di gestione di un form, specie se i form in un'applicazione sono diversi e ciascuno di natura propria. Ci dovrà per forza essere una classe ElaboraForm (nella migliore delle ipotesi iperdinamica e valida per tutti i form, nella peggiore classi diverse per ciascun form) e una classe DB che gestisca la connessione. Il passaggio dei dati da un'istanza ElaboraForm a quella DB è la cosa che al momento mi è particolarmente oscura da comprendere.




    Riguardo PDO, non lo sto usando perchè sto più o meno cominciando a muovermi ora con gli oggetti, e non volevo sin da ora usare una pappa pronta che non avevo tempo di comprendere fino in fondo. Ma alla fine mi toccherà, anche perchè sto odiando profondamente la funzione mysqli ad oggetti, la trovo una cattiveria senza motivo.
    Ultima modifica di Korenaar; 05-03-2014 a 15:46

  6. #6
    Il fatto che una variabile definita all'interno di una classe si "public" non vuol dire che è accessibile al di fuori di quella classe così com'è, ma che è una proprietà di quell'oggetto che io posso leggere. Tu puoi anche ritornare una variabile, ma devi comunque assegnarla ad un'altra variabile, ad esempio così:
    Codice PHP:
    $connessione = new connessionedb
    e solo a questo punto puoi fare tipo

    Codice PHP:
    InserisciNelDb($connessione
    utilizzando la $connessione che ti è stata ritornata dalla tua classe.

    Come ti dicevo però questo non ha molto senso (meglio fare una classe "DB", instanziarla come oggetto tipo $db e fare tutto lì, connessione nel costruttore e poi chiamata ai metodo tipo $db->eseguiQuery(), funzione che accederà alla $connessione creata dal costruttore e interna all'oggetto)

    Tra l'altro prima ho scritto una stupidata, per accedere ad una proprietà (variabile) di un oggetto da fuori quell'oggetto la devi dichiarare "public"

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    208
    Quote Originariamente inviata da html5today Visualizza il messaggio
    Il fatto che una variabile definita all'interno di una classe si "public" non vuol dire che è accessibile al di fuori di quella classe così com'è, ma che è una proprietà di quell'oggetto che io posso leggere. Tu puoi anche ritornare una variabile, ma devi comunque assegnarla ad un'altra variabile, ad esempio così:
    Codice PHP:
    $connessione = new connessionedb
    Ecco, questo è il passaggio logico che mi mancava probabilmente. Nel procedurale bastava fare global $variabile per averla a disposizione, davo per scontato che la variabile ritornata diventasse automaticamente disponibile per nuove manipolazioni così com'è.

    Tra l'altro prima ho scritto una stupidata, per accedere ad una proprietà (variabile) di un oggetto da fuori quell'oggetto la devi dichiarare "public"
    o specificare nel construct il $this->variabile = $variabile credo.

    Grazie comunque intanto, probabilmente mi hai chiarito il punto che mi mancava

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 © 2024 vBulletin Solutions, Inc. All rights reserved.