Search code examples
phpclassooppdoconnection

Its possible to use $conn global var into class in php?


I trying to use $conn variable into a class article. I create a configuration.php file

cnfiguration.php

try {
    $conn = new PDO('mysql:host='.$dbhost.';dbname='.$dbname, $user, $pass);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

I agree, it's a classic way to make a database connection.

I tried to use the $conn variable into class as I said.

class.article.php

class Article {
    global $conn;
    public $article_id;
    function setArticle($article_id) {
        $this->article_id = $article_id;
    }

    function getArticle($article_id){
        $getArticlee = $conn->prepare("SELECT * FROM articles WHERE id = :id");
        $getArticlee->bindParam(':id', $article_id, PDO::PARAM_INT);
        $getArticlee->execute();
        return $getArticlee;
    }
}

I requiring both files in executing file (show.article.php) by next order

  1. configuration.php
  2. class.article.php

After all of this I getting an error, an executing a show.article.php. When I remove

global $conn;

I don't have any error. But then I don't have an connecton to database.

I need some solution to include $conn variable into a class, because this is just one class which one will need a database connection, I'll have about 10-15 class with a pdo connection.


Solution

  • You could place global $conn inside the getArticle method.

    ...
    
    function getArticle($article_id){
      global $conn; // not recommended
    
      $getArticle = $conn->prepare("SELECT * FROM articles WHERE id = :id");
      ...
    }
    

    However, this approach is discouraged as now your Article class has an implicit dependancy on external state and is harder to reason about and test.

    A better option is to pass the PDO object into the Article constructor and keep it as a private property that your methods can call on.

    class Article {
      private $conn;
      public $article_id;
      ...
    
      function __construct(\PDO $conn) {
        $this->conn = $conn;
      }
    
      function getArticle($article_id){
        $getArticlee = $this->conn->prepare("SELECT * FROM articles WHERE id = :id");
        ...
      }
    }