【问题标题】:Classes using mysqli使用 mysqli 的类
【发布时间】:2013-08-26 00:32:44
【问题描述】:

我正在用 PHP 构建一个 API,我有一个问题。我正在使用类,其中一些类需要访问我的数据库。但是,我不想在每个单独的类中为数据库定义变量以便打开它,或者必须将我的 mysqli 对象作为每个单独的类构造函数的参数发送。

解决此问题的最佳方法是什么?我是否定义了某种全局变量?

【问题讨论】:

    标签: php mysql class mysqli


    【解决方案1】:

    一个经典的解决方案如下

    1. 创建 dbatabase 处理程序类的实例,可以是原始 mysqli(更差)或更好的抽象类(更好)
    2. 在应用程序类的构造函数中,将此 db 类实例作为参数并将其分配给局部变量
    3. 在您的班级中使用此变量。

    一个简单的例子:

    class Foo()
    {
        protected $db;
        function __construct($db);
        {
            $this->db = $db;
        }
        function getBar($id)
        {
            return $this->db->getOne("SELECT * FROM bar WHERE id=?i", $id);
        }
    }
    $db = new safeMysql();
    $foo = new Foo($db);
    $bar = $foo->getBar($_GET['id']);
    

    【讨论】:

      【解决方案2】:

      使用静态类怎么样?

      class mysqli_wrapper {
      private static $db = null;
      
      public static function open() {
          GLOBAL $opts; // this can be global or setup in other ways
          if (!self::$db) {
              self::close();
              self::$db = null;
          }
          self::$db = @mysqli_connect('p:'.$opts['hn'], $opts['un'], $opts['pw'], $opts['db']);
          return self::$db;
      }
      public static function query($qry) {
          return mysqli_query ( self::$db, $qry );
      }
      public static function affected_rows() { return @mysqli_affected_rows(self::$db); }
      public static function error() { return @mysqli_error(self::$db); }
      public static function close() { @mysqli_close(self::$db); }
      } // end mysqli_wrapper
      
      mysqli_wrapper::open(); //  Here's how to call it
      

      【讨论】:

      • 问题是如果我想在一个类中调用这个包装器,仅仅将它包含在类中是行不通的。我想在类内部进行查询并在外部打开数据库连接。
      【解决方案3】:

      在一个系统中,我维护我的应用程序需要访问它自己的 MySQL 数据库,以及远程 Oracle 和 SQL Server 数据库,并且我为它使用了一个 trait。这是我的代码的简化,仅使用 MySQL:

      dbaccess.php

      trait DatabaseAccess {
          protected $db;
          private $host = 'host', $dbName = 'db', $username = 'username', $password = 'pword';
      
          public function connectToMysql() {
               $this->db= new mysqli(......);
          }
      }
      

      然后在 myclass.php 中

      require 'dbaccess.php'; 
      class MyClass {
          use DatabaseAccess;
      
          //class code.....
      }
      

      DatabaseAccess 的所有元素都将可用,就像您在 MyClass 中手动键入它们一样。 注意:如果你使用的是 PHP

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-09
        • 2018-02-25
        • 1970-01-01
        • 2017-09-22
        相关资源
        最近更新 更多