2010-09-29 13 views
5

Tengo una clase de base de datos, que se utiliza para seleccionar, actualizar, eliminar MySQL consultas.¿Cómo acceder a un objeto de otra clase?

Ahora, quiero crear una consulta MySQL dentro de otra clase, pero si defino $db = new DB(); en index.php, no puedo usar la var $db en otra clase. ¿Tengo que definir la variable $db una y otra vez, si deseo hacer una consulta? ¿O hay una manera de hacer que la var $db con un objeto var global?

Respuesta

0

En su uso index.php archivo

require_once('path_to_file_with_class.php'); 

También puede utilizar include_once, que le dan una advertencia en lugar de un error si el archivo 'path_to_file_with_class.php' no está disponible.

-1

podría definir como global en su archivo index.php, y en el constructor de la clase también puso $this->db &= $GLOBALS['db'];

5

Es posible que desee un singleton. Esto le proporciona una forma de obtener una instancia de DB en cualquier parte del código. Luego, en cualquier lugar que desee hacer una consulta, primero haga $db = DB::getInstance();.

Una alternativa es dependency injection, que pasa una instancia DB a todas las clases que necesitan una.

+0

Un ejemplo para el patrón Singleton en php se puede encontrar aquí: http://www.weberdev.com/get_example-4002.html – Zilverdistel

+0

Para hacer que un objeto disponible a nivel mundial sólo se necesita un método estático instanciarlo . No tiene que ser Singleton. Ambos huelen mal, por lo que Dependency Injection es el camino a seguir. – Gordon

0

Defínalo en una clase (archivo PHP). Luego, solicítelo para cada archivo PHP en el que se necesite la var.

0

Primero haga que su clase de base de datos sea singleton. Y luego, en su nueva clase que usted puede hacer algo como:

class myNewClass{ 
    private $_db; 

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

utilizar la función de magia __autoload().

11

El enfoque más limpio sería aggregate la clase de base de datos donde injecting lo necesita. Todos los demás enfoques, como el uso de la palabra clave global o el uso de los métodos static, y mucho menos un Singleton, introducen un estrecho acoplamiento entre sus clases y el alcance global, lo que hace que la aplicación sea más difícil de probar y mantener. Sólo hacer

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

y

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

Uso Constructor Injection si se requiere la dependencia para crear un estado válido para la instancia. Si la dependencia es opcional o debe ser intercambiable en tiempo de ejecución, use Setter Injection, p.

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

¿Y cómo exactamente uso el $ db var que? $ this-> db-> select(); ? – Mike

+0

@Mike sí, exactamente así. O a través de un getter (si escribiste uno) – Gordon

Cuestiones relacionadas