Llamada a una función miembro prepare () en un objeto no en PDO

Hola chicos, estoy teniendo problemas con mi código. con __construct () Obtengo el error Fatal: Llamo a una función de miembro prepare () en un no objeto pero sin él mi código está funcionando.

class Animals{ public $db_fields; public function __construct(){ $this->db_fields = $this->get_fields(); foreach($this->db_fields as $field){ $this->$field = ""; } public function get_fields(){ global $dbh; $q = $dbh->prepare("DESCRIBE animals"); $q->execute(); $db_fields = $q->fetchAll(PDO::FETCH_COLUMN); return $db_fields; } } $f = new Animals(); /*** mysql hostname ***/ $hostname = 'localhost'; /*** mysql username ***/ $username = 'root'; /*** mysql password ***/ $password = ''; /*** mysql database***/ $dbname = 'animals'; try { $dbh = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password); /*** echo a message saying we have connected ***/ echo 'Connected to database 
'; $dbh = null; } catch(PDOException $e) { echo $e->getMessage(); }

Solo quiero que mis campos (animal_id, animal_type, animal_name) funcionen igual que

 public $animal_id; public $animal_type; public $animal_name; 

get_fields() crear una instancia del objeto Animals después de crear $dbh ; de lo contrario, no se define en la función get_fields() .

 $dbh = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password); $f = new Animals(); 

Una vez dicho esto, un mejor diseño es usar dependency injection y enviar el objeto $dbh a la clase, así:

 $dbh = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password); $f = new Animals( $dbh); 

Por lo tanto, su clase actualizada se vería así:

 class Animals{ private $dbh; public function __construct( $dbh){ $this->dbh = $dbh; } public function get_fields(){ $q = $this->dbh->prepare("DESCRIBE animals"); } } 

¿El beneficio? Te deshaces de la variable global . Por lo general, requerir una variable global es un mal diseño y quieres evitarlo. Puedes ver por qué solo se basa en el problema que tienes: requiere un estado global para poder funcionar.