可以在 php 中的 class 中使用 $conn 全局变量吗?

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

我试图在 class 文章中使用 $conn 变量。 我创建了一个 configuration.php 文件

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();
}

我同意,这是建立数据库连接的一种 classic 方式。

我试着用 $conn 变量进入 class 就像我说的那样。

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;
    }
}

我要求这两个文件都按下一个顺序执行文件 (show.article.php)

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

在所有这一切之后我得到了一个错误,正在执行 show.article.php。 当我删除

global $conn;

我没有任何错误。但是我没有连接到数据库。

我需要一些解决方案来将 $conn 变量包含到 class 中,因为这只是一个 class 需要数据库连接,我将有大约 10- 15 class 具有 pdo 连接。

无法在 class 中使用 $GLOBALS。 你可以对你的条件做一些改变...

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;
 }
}

可以global $conn放在getArticle方法中。

...

function getArticle($article_id){
  global $conn; // not recommended

  $getArticle = $conn->prepare("SELECT * FROM articles WHERE id = :id");
  ...
}

但是,不鼓励使用这种方法,因为现在您的 Article class 对外部状态具有隐式依赖性,并且更难推理和测试。

更好的选择是将 PDO 对象传递给 Article 构造函数并将其保留为您的方法可以调用的私有 属性。

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