它可以在php中使用$ conn global var到class吗? [重复]

This question already has an answer here:

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.

</div>

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");
    ...
  }
}

It is not possible to using $GLOBALS in a class. you can do some changes in your conding...

cnfiguration.php

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

class.article.php

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

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