¿Cómo pasar la conexión de BD a otra clase?

Actualmente estoy tratando de pasar una conexión de base de la siguiente manera:

class Test { public $user; public $db; function __construct() { // connect to database try { $this->db = new PDO('mysql:host='.DB_HOST.';dbname='.DB_DATABASE.'', DB_USERNAME, DB_PASSWORD); $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $err) { die($err->getMessage()); } $this->user = new User($this->db); } } class User { public $db; function __construct($db) { $this->db = $db; } // execute some query $sql = "SELECT * FROM test"; $sth = $this->db->prepare($sql); $sth->execute(); $result = $sth->fetch(); if(!empty($result)) { echo '
'; var_dump($result); echo '

'; } }

Pero obtengo: Error fatal: llamada a una función miembro prepare () en un objeto no. ¿Qué estoy haciendo mal?

Tienes la parte passing-db-to-class-constructor correcta.

Pero esta no es una definición de clase válida de la forma en que la ha codificado. Necesita poner esas líneas de código (siguiendo // execute some query ) en una función. Las líneas de código no pueden vivir donde están, flotando dentro de la clase User pero no dentro de una función. No es PHP legal.

También debe verificar el estado del error después de cada llamada para preparar () o ejecutar (). Devuelven FALSE si hay un error, como un error de syntax SQL, o la tabla no existe, etc.

 class User { public $db; function __construct($db) { if (! $db instanceof PDO) { die("What are you trying to pull anyway?"); } $this->db = $db; } function doSomething() { // execute some query $sql = "SELECT * FROM test"; $sth = $this->db->prepare($sql); if ($sth === false) { die(print_r($this->db->errorInfo(), true)); } $status = $sth->execute(); if ($status === false) { die(print_r($sth->errorInfo(), true)); } $result = $sth->fetch(); if(!empty($result)) { echo '
'; var_dump($result); echo '

'; } } }