PHP将数据导入类

时间:2015-04-28 15:33:31

标签: php database class oop

我有一个用于数据库连接到mySQL数据库的类,这个类有很多功能,完全是我自己的工作,我将它复制并粘贴到新项目中。

该类包含三个私有变量,用于数据库名称,用户和密码。

目前,这些值在构造时在类中手动设置为:

class database {
    private $dbUser = "username";
    private $dbPass = "pass";
    private $dbName = "database";
    public  $dbLink = null; //the placeholder for the database object.

   public function __construct(){
        $this->dbConnect();
        }

    private function dbConnect(){
        $this->dbLink = new mysqli("localhost", $this->dbUser, $this->dbPass, $this->dbName);

///simplified
        return true;
    }

}

然而,当我扩展和编辑我的数据库类,并向该类添加新的功能和方法时,我发现我想要在其运行的所有站点上更新类文件,每个站点都有自己的数据库连接和日志因此,它不像复制/粘贴或Save As...那么简单,因为我需要保留每个数据库类文件中的数据库连接详细信息。

那么,我想知道的是,如果有一个既定的“正确”方法,应该这样做?如果是这样,它是什么,因为我发现Google和StackOverflow搜索将数据从另一个文件导入类中的情况令人惊讶。

可能的想法:

  • 有一个包含连接详细信息的基类,然后是一个扩展类,其中包含可以轻松更新的所有方法等,而不会丢失连接细节。

  • 将连接详细信息保存在另一个文件中,并使用file_get_contents方法中的__construct将其作为字符串导入。

  • 在班级中使用include()个电话直接导入变量值。

我正在考虑使用另一个包含连接详细信息的文件,然后可以在构造数据库类时将其导入数据库类。

但我很谨慎,因为我不希望数据库连接细节公开可用,例如作为connection.txt文件或类似的东西。另外我觉得让类成为空原始的扩展可能总体上更好,但是更多的工作是将我当前的站点/数据库类对象变成这个新形状。

应该以什么方式使用未包含在类本身中的特定数据来实现类。所以我可以继续更新并覆盖该类而不必担心覆盖数据库连接细节?

更新/澄清

将详细信息作为参数传递给构造函数并不能解决我需要将这些参数存储在某个地方的问题我可以在程序员可以根据需要更新它们。我可以使用file_get_contents从其他文件中将它们传递给构造函数。

连接: 每个网站都会从课程中为$ dbLink创建一个对象,__construct每个网站每个页面运行一次。

3 个答案:

答案 0 :(得分:1)

有两种方法可以做到这一点。第一种方法是将细节传递给构造函数,如果只在一个地方调用连接,这可能是最好的方法。

class database {
    public $link;

    public function __construct($dbHost, $dbUser, $dbPass, $dbName)
    {
        $this->link = new mysqli($dbHost, $dbUser, $dbPass, $dbName);
    }
}

$database = new database('localhost', 'username', 'password', 'database');

通常,您会将配置文件中的连接详细信息保留为变量,然后传入变量。

第二种方法是,正如您所提到的,每个连接扩展一次核心类。

class database {
    public $link;
    protected $host;
    protected $user;
    protected $pass;
    protected $name;

    protected function connect()
    {
        $this->link = new mysqli($this->host, $this->user, $this->pass, $this->name);
    }
}

class my_connection extends database {
    public function __construct($host, $user, $pass, $name)
    {
        $this->host = $host;
        $this->user = $user;
        $this->pass = $pass;
        $this->name = $name;
        $this->connect();
    }
}

无论哪种方式都没问题。没有这样的标准,只需选择哪种方式最适合你。

答案 1 :(得分:0)

你可以做;

<?php
require_once(dirname(__FILE__) . 'database.php');

但是,更好的方法是设置一个包含所需信息的配置文件。

<?php
require_once(dirname(__FILE__) . '/path-to/config/config.inc.php');

希望这有帮助。

更新:added example gist here或结帐Laravel's (GitHub)文件结构和configurations

答案 2 :(得分:0)

  1. 将您的共享库创建为单独的项目。
  2. 将该项目推送到某处的GIT仓库(也许是BitBucket)。
  3. 创建私有作曲程序包主机(可能使用Toran Proxy)。
  4. 将您的GIT仓库添加到您的包裹主机。
  5. 将所有项目转变为作曲家项目。
  6. 将您的共享库添加到每个项目的依赖项中。
  7. 在将项目发布到生产环境之前,请运行composer install。
  8. 将数据库凭据设置为每个站点的环境变量。
  9. 将环境变量读入您的数据库类。
  10. 通过这种方式,您可以轻松地在项目之间共享代码,并将数据库凭据保留在源代码之外。