【问题标题】:PHP: use a database within a classPHP:在类中使用数据库
【发布时间】:2014-01-08 15:42:04
【问题描述】:

我已经有一个数据库文件,当我包含它时它会连接到数据库

class-database.php

class dbFactory {
    private static $host    = 'some.host.com';
    private static $name    = 'someDB';
    private static $user    = 'someUser';
    private static $pass    = 'somePassword';


    public function __construct() { }


    public static function pdo() {
        try {
            # MySQL with PDO_MYSQL
            return new PDO("mysql:host=$host;dbname=$name", $user, $pass);
            }
        catch(PDOException $e) {
            echo $e->getMessage();
            return null;
            exit;
            }  
    } // End: pdo()
} //End class

我通常通过以下方式访问它:

require( 'some-file-path' . 'class-database.php' );
$db = dbFactory::pdo();

这是一个问题: 如何从另一个班级访问$db

例如,如果我有一个名为class-html.php 的类文件并且在该类中(也称为类代码的一部分),我需要类似...:

class-html.php

class html {
  ...some code...
  $db->query('SELECT * FROM tbl_head');
  ...some more code...
} //End: html

我一直没有成功的是:

require( 'some-file-path' . 'class-database.php' );
$db = dbFactory::pdo();

require( 'some-file-path' . 'class-html.php' );

我收到错误消息,不知道从这里做什么

【问题讨论】:

  • 在这种情况下,两个答案都是我解决问题所需要的。但是,该站点不允许接受两个条目作为答案。我该怎么办?

标签: php mysql database class pdo


【解决方案1】:

您可以使用Singleton class

class dbFactory {

    //...
    private static $pdo_instance = null;

    private static function getPDOinstance() {
        if (self::$pdo_instance === null) {
            try {
                self::$pdo_instance = new PDO("...");
            } catch (PDOException $e) {
                //...
            }
        }
        return self::$pdo_instance;
    }

}

当您现在访问 dbFactory::getPDOinstance() 时,您将只有一个使用 DB 在每个类中创建新的 PDO 实例

【讨论】:

    【解决方案2】:

    class-html.php 中的类可以稍作修改,如下所示:

    require( 'some-file-path' . 'class-database.php' );
    
    class SomeClass {
      public $db;
    
      def __construct() {
        $db = dbFactory::getPDOinstance();
        // existing code ..
      }
    
      // other code      
    }
    

    然后,您可以像往常一样要求该课程,并且:

    require( 'some-file-path' . 'class-html.php' );
    $obj = new SomeClass();
    $obj->db->query('SELECT * FROM tbl_head')
    

    更新:如果您多次实例化SomeClass,这将创建一个新的 PDO 实例。
    更新:利用 kingkero 的答案来使用现有的 @改为 987654326@ 实例。

    【讨论】:

    • 人们可能不想为每个 SomeClass 对象创建一个新的 PDO 对象,也不希望这些对象与其他地方使用的对象不同。
    • @stoic 如果已经启动了一个数据库实例,在本例中为$db,则无法在另一个类 (html) 中访问此“实例”,并且该其他类 (html) 必须创建一个全新的数据库实例?我说的对吗?
    • 不,您可以将实例“保存”在您的 dbFactory 中。您可以在wiki link I posted 中阅读更多相关信息
    • @Omar:是的,如果您有一个$db 的活动实例,那么它将不同于上述解决方案为您创建的实例,即再次创建数据库实例。如果您更喜欢(并且应该)使用 $db 的单个实例,则将 dbFactory 设为单例类,正如 kingkero 在他的回答中所做的那样,然后使用我的方法调用适当的行为。我将更新我的答案以建立在 kingkero 的答案的基础上。
    • @stoic SomeCalss 的 $db 是否公开重要吗?它可以是私有的或受保护的,还是真的不重要?
    猜你喜欢
    • 2014-09-23
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 2011-08-01
    相关资源
    最近更新 更多