2010-09-29 15 views
5

Ho una classe di database, che viene utilizzata per selezionare, aggiornare, eliminare le query MySQL.Come accedere ad un oggetto da un'altra classe?

Ora, voglio creare una query MySQL all'interno di un'altra classe, ma se definisco $db = new DB(); in index.php, non posso usare la variabile $db in un'altra classe. Devo definire la variabile $db più e più volte, se voglio fare una query? O c'è un modo per rendere il $db var con un oggetto globale var?

risposta

0

Nel vostro uso del file index.php

require_once('path_to_file_with_class.php'); 

Si può anche utilizzare include_once, che vi darà un avvertimento, invece di un errore se il file 'path_to_file_with_class.php' non è disponibile.

-1

si potrebbe definirla come globale nel file index.php, e nel costruttore della classe anche mettere $this->db &= $GLOBALS['db'];

5

Probabilmente si desidera un singleton. Questo ti dà un modo per ottenere un'istanza di DB ovunque nel codice. Quindi ovunque tu voglia fare una query, prima fai $db = DB::getInstance();.

Un'alternativa è dependency injection, che passa un'istanza DB a tutte le classi che ne hanno bisogno.

+0

Un esempio per il pattern Singleton in PHP può essere trovato qui: http://www.weberdev.com/get_example-4002.html – Zilverdistel

+0

Per rendere un oggetto disponibile a livello globale è necessario solo un metodo statico per creare un'istanza di esso . Non deve essere Singleton. Entrambi sono puzzolenti, quindi Dipendenza dall'iniezione è la strada da percorrere. – Gordon

0

Definirlo in una classe (file PHP separato). Quindi richiederlo per ogni file PHP in cui è necessario var.

0

Per prima cosa creare la classe di database singleton. E poi nella nuova classe si può fare qualcosa di simile:

class myNewClass{ 
    private $_db; 

    public function __construct(){ 
    $this->_db = DB::getInstance(); 
    } 
} 
0

utilizzare la funzione magica __autoload().

11

L'approccio più pulito sarebbe quello di aggregate la classe di database dove necessario da injecting esso. Tutti gli altri approcci, come l'utilizzo della parola chiave global o utilizzando i metodi static, nonché Singleton, stanno introducendo un accoppiamento stretto tra le classi e l'ambito globale che rende l'applicazione più difficile da testare e mantenere. Basta fare

// index.php 
$db = new DBClass;    // create your DB instance 
$foo = new SomeClassUsingDb($db); // inject to using class 

e

class SomeClassUsingDb 
{ 
    protected $db; 
    public function __construct($db) 
    { 
     $this->db = $db; 
    } 
} 

Utilizzare Constructor Injection se la dipendenza è necessario per creare uno stato valido per l'istanza. Se la dipendenza è facoltativa o deve essere intercambiabile in fase di runtime, utilizzare Iniezione settetta, ad es.

class SomeClassUsingDb 
{ 
    protected $db; 
    public function setDb($db) 
    { 
     $this->db = $db; 
    } 
} 
+0

E in che modo esattamente utilizzo la variabile $ db var? $ This-> db-> select(); ? – Mike

+0

@Mike sì, esattamente come questo. O attraverso un getter (se ne hai scritto uno) – Gordon

Problemi correlati