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 不小心不正规的开发公司导致不给我们y码,
  • ¥15 我的代码无法在vc++中运行呀,错误很多
  • ¥50 求一个win系统下运行的可自动抓取arm64架构deb安装包和其依赖包的软件。
  • ¥60 fail to initialize keyboard hotkeys through kernel.0000000000
  • ¥30 ppOCRLabel导出识别结果失败
  • ¥15 Centos7 / PETGEM
  • ¥15 csmar数据进行spss描述性统计分析
  • ¥15 各位请问平行检验趋势图这样要怎么调整?说标准差差异太大了
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 wpf界面一直接收PLC给过来的信号,导致UI界面操作起来会卡顿