【问题标题】:PHP importing data into a classPHP将数据导入类
【发布时间】:2015-04-28 15:33:30
【问题描述】:

我有一个用于数据库连接到 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 搜索中发现的将数据从另一个文件导入到类中的结果令人惊讶地少。

可能的想法:

  • 有一个包含连接详细信息的基类,然后是一个包含所有方法等的扩展类,这些方法可以在不丢失连接详细信息的情况下轻松更新。

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

  • 在类中使用include()调用直接导入变量值。

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

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

应该如何使用不包含在类本身中的特定数据来实现类。这样我就可以继续更新和覆盖类而不用担心覆盖数据库连接细节?

更新/澄清

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

连接: 每个网站都会从类中为 $dbLink 创建一个对象,__construct 将在每个页面、每个网站上运行一次。

【问题讨论】:

  • 数据库连接调用了多少个地方?
  • 如何将细节作为参数传递给构造函数并在那里设置类变量?
  • 每个网站都有自己的数据库类,其中包含网站特定的数据库连接详细信息。我会更新我的问题...
  • 在这样一个通用类中存储硬编码的细节不是一个好主意,因为它不是很便携(就像你刚刚发现的那样)。该类在某处被实例化,这是您将详细信息传递给构造函数的地方。
  • 是的,我找到了这个,@chris --- 你会说什么是解决这种困境的好方法?

标签: php database class oop


【解决方案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();
    }
}

无论哪种方式都可以。没有这样的标准,只需选择最适合您的方式即可。

【讨论】:

  • file_get_contents 例程将详细信息传递给构造函数会打开一个列出用户名/数据库名/密码的文件并将它们应用于私有变量,会不会有任何值得注意的问题?
  • 完全没有,通常你会使用includerequire 来加载包含变量的配置文件。
  • 啊,我考虑过使用 include/require,然后在我的思绪转向file_get_contents 时忘记了它。我认为使用 require 可能对我有用。欢呼
  • 我最终决定使用包含将变量从外部 PHP 文件直接添加到类中对我来说是最有效的。为您的帮助干杯
【解决方案2】:
  1. 将您的共享库创建为单独的项目。
  2. 将该项目推送到某个地方的 GIT 存储库(可能是 BitBucket)。
  3. 创建一个私有 composer 包宿主(可能使用 Toran 代理)。
  4. 将您的 GIT 存储库添加到您的包主机。
  5. 将您的所有项目转变为作曲家项目。
  6. 将您的共享库添加到每个项目的依赖项中。
  7. 在将项目发布到生产环境之前,请运行 composer install。
  8. 将数据库凭据设置为每个站点的环境变量。
  9. 将环境变量读入您的 DB 类。

通过这种方式,您可以轻松地在项目之间共享代码,并且您的数据库凭据不会出​​现在源代码之外。

【讨论】:

    【解决方案3】:

    你可以的;

    <?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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-06
      • 2011-12-03
      • 2015-01-30
      • 1970-01-01
      • 1970-01-01
      • 2017-05-10
      相关资源
      最近更新 更多