douhan0562 2019-06-18 10:53
浏览 132
已采纳

它可以在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>
  • 写回答

2条回答 默认 最新

  • dongzhoulong1797 2019-06-18 11:36
    关注

    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");
        ...
      }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 乌班图ip地址配置及远程SSH
  • ¥15 怎么让点阵屏显示静态爱心,用keiluVision5写出让点阵屏显示静态爱心的代码,越快越好
  • ¥15 PSPICE制作一个加法器
  • ¥15 javaweb项目无法正常跳转
  • ¥15 VMBox虚拟机无法访问
  • ¥15 skd显示找不到头文件
  • ¥15 机器视觉中图片中长度与真实长度的关系
  • ¥15 fastreport table 怎么只让每页的最下面和最顶部有横线
  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?