Inizializzare DataBase nel costruttore di una Classe

Mi sto sforzando di programmare ad oggetti.

Attualmente ogni volta che un metodo di una classe richiede di consultare il database accludo alla funzione che definisce il metodo un file esterno che esegue la connessione al database tramite l'estensione PEAR::DB.

In questo modo ho però molti require:

require_once ('include/db.php');

ecco il contenuto di db.php:

<?php

require_once 'path\to\DB.php';
require_once 'path\to\DB\common.php';

include ('config.inc'); // file contenenti le chiavi di accesso al database

$dsn = "$db_type://$db_user:$db_password@$db_host/$db_database";

$options = array(
        'result_buffering' => 500,
        'persistent' => false,
        'ssl' => false,
        'debug' => 2,
        'seqname_format' => '%s_seq',
        'autofree' => true,
        'portability' => DB_PORTABILITY_ALL,
        'optimize' => 'performance',      );

// APRO LA CONNESSIONE
$db =& DB::connect($dsn, $options);

// controllo in caso di errore
if (PEAR::isError($db)) {
   die($db->getMessage());
}
?>

il costruttore della classe invece è:

function Application () {
      include('config.inc');
      include('db.php');
   }

Ma non funziona. Ricevo come errore:

Fatal error: Call to a member function query() on a non-object

dove query () è un metodo di DB che richiamo in questo modo:

$result = $db->query($query);

Mi sembra di capire che è un problema di scope.

Ma leggendo il manuale nel costruttore non posso scrivere:

var $db =& DB::connect($dsn, $options);

altrimenti avrei fatto:

$result = $this->db::query($query); // credo

Cos'è che non ho capito della programmazione ad oggetti?

Forse devo estendere la classe della mia applicazione includendo la classe DB di PEAR?

inviato 10 anni fa
arjuna
X 0 X

Dovresti seguire un altro approccio. Crea un oggetto DB $db. Poi in ogni altro oggetto che necessita l'accesso al DB puoi seguire 2 strade:

1) nei metodi che effettuano delle query dai visibilità all'oggetto $db con un:

     global $db;

per utilizzarlo ti basterà usare la sintassi

    $db->nome_metodo();

2) nelle classi che usano il db crea una variabile db:

   var $db

e poi al costruttore passi per riferimento l'oggetto $db creato inizialmente

$mio_oggetto = new mia_classe($db);

il costruttore sarà

mia_classe(&$db)

{

   $this->db = $db;

nei metodi della classe mia_classe accederai al DB  così:

$this->db->metodo();

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Ho seguito il secondo metodo, mi sembra più performante per quello che devo fare...

la cosa che mi stupisce è che funziona!!!

è proprio vero che la Sapienza pare Magia agli occhi dei Profani.

Infatti Mago deriva dal Persiano, la radice Mag vuol dire Conoscenza.

TNXS

risposto 10 anni fa
arjuna
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda