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 鸿业暖通修改详细负荷时闪退
  • ¥15 有偿求码,CNN+LSTM实现单通道脑电信号EEG的睡眠分期评估
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题
  • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体