【问题标题】:PHP: define constants outside a class or in the constructor?PHP:在类外部或构造函数中定义常量?
【发布时间】:2011-12-27 05:34:10
【问题描述】:

我是新来的类和oo。 我一直在寻找一个基本的 MySQL 类开始,我找到了 Matthew Saragusa 的“A Simple MySQL Class”。

这些是第一行:

define('SIMPLE_DB_SERVER', 'mysqlserver.net');
define('SIMPLE_DB_NAME', 'mydbname');
define('SIMPLE_DB_USERNAME', 'myusername');
define('SIMPLE_DB_PASSWORD', 'mypassword');
class ASimpleMySQLDB {
    public function __construct($server, $database, $username, $password){

        $this->conn = mysql_connect($server, $username, $password);
        $this->db = mysql_select_db($database,$this->conn);
    }
[...]

我想知道是否有特定原因在类外部定义常量,而不是使用构造函数 - 示例:

public function __construct(){
    $this->conn = mysql_connect('localhost', 'username', 'password');
    $this->db = mysql_select_db('database',$this->conn);
}

或者:

public function __construct($which_db){
        if($which_db=='firstdb'){
            $server='localhost';
            $username='user1';
            $password='pass1';
            $database='db1';
        }elseif($which_db=='otherdb'){
            $server='localhost';
            $username='user2';
            $password='pass2';
            $database='db2';
        }

    $this->conn = mysql_connect($server, $username, $password);
    $this->db = mysql_select_db($database,$this->conn);

}

或者使用开关之类的。

这两种方法有什么区别?你会推荐哪个?非常感谢:-)

【问题讨论】:

  • 如何在 .ini 文件中定义它们:P

标签: php oop class constructor constants


【解决方案1】:

这种分离很可能是因为ASimpleMySQLDb 类是数据库的包装器。这是一个通用类,因此通过在构造函数中硬编码连接细节来使其具体化,这样您就无法重用它。您希望即使在单个应用程序中也能保持这种灵活性,因为您最终可能会使用多个数据库。

就个人而言,我倾向于创建一个遵循单例模式的Application 类,并将我的数据库连接详细信息声明为该类中的static 变量。这使我仍然可以轻松更改我的数据库连接信息或根据需要添加其他数据库。

【讨论】:

    【解决方案2】:
    1. 因此其他文件/类可以访问定义的值 (GLOBAL)
    2. 更容易编辑,以防您将来要更改数据库

    实现这一点的最佳方法是创建一个包含所有这些定义的配置文件。 即

    配置.php

    define('SIMPLE_DB_SERVER', 'mysqlserver.net');
    define('SIMPLE_DB_NAME', 'mydbname');
    define('SIMPLE_DB_USERNAME', 'myusername');
    define('SIMPLE_DB_PASSWORD', 'mypassword');
    

    并将它们包含在您的 MySQL 连接类 connection.php 中

    include "configuration.php";
    
    class DBConnection 
    {
        public function __construct(){
            $this->conn = mysql_connect(SIMPLE_DB_SERVER, SIMPLE_DB_USERNAME, SIMPLE_DB_PASSWORD);
            $this->db = mysql_select_db(SIMPLE_DB_NAME,$this->conn);
        }
    }
    

    【讨论】:

      【解决方案3】:

      尽管现在大多数 OO PHP 开发人员不鼓励这样做,但许多库仍然使用define() 来设置需要由实现库的最终方修改的配置常量。这些通常存放在需要此配置信息的类所需要/包含的配置文件中,或者如果全局需要,甚至包含在堆栈的进一步备份中(想到 Wordpress。)

      PHP 5 包含类常量来实现相同的功能,但仅限于类本身的范围内。

      http://php.net/manual/en/language.oop5.constants.php

      这种方法是创建您的库将需要的特定于类的、不可更改的值的好方法。由于在 PHP 中使用 OOP 的主要目标之一是代码可重用性,因此它很好地打包了配置以供发布。对于您的数据库类,您可以在定义所有访问凭证(例如 db_host、db_user 和 db_pass)的构造方法之前使用 const 声明。请注意,ClassName::ConstName 必须像静态方法一样访问这些常量。

      尽管 PHP 中的 OOP 已经取得了长足的进步,并且现在已经很普遍,但大量旧的或更多“锁定”的框架和库仍然使用定义约定,因此即使在 OO 环境中,您也会看到它非常常用。

      【讨论】:

      • 非常感谢,正是我希望听到的。
      • 如果您也只是在学习,我建议您尽可能多地阅读 PHP 文档的类章节。它确实有助于理解静态与实例化方法和对象继承等核心内容。 php.net/manual/en/language.oop5.php 即使我的团队早已从 PHP 切换到 Python,PHP 文档的质量和范围仍然是我真正怀念的东西!
      • 我自学了 php,现在我正在阅读 Peter MacIntyre 的书 shop.oreilly.com/product/9780596804381​​.do 不幸的是我是意大利人,虽然我熟悉英语,但技术语言是对我来说仍然很难:-)
      【解决方案4】:

      常量定义在一个地方。在您的示例中,其他开发人员必须搜索数据库参数的位置。

      【讨论】:

        【解决方案5】:

        我不确定特定 MySQL 连接类的特定上下文,但是将连接信息定义为常量而不是类属性之间的区别是范围之一。

        在特定代码行运行后,这些常量在代码库中的任何位置都可用,因此您可以在 ASimpleMySQLDB 类之外访问它们。另一方面,在构造函数中定义的任何变量都不能在类之外工作。

        通常,我发现人们在代码的开头使用常量来设置最终用户需要修改(通常只修改一次)的值(WordPress 在他们的 wp-config.php 文件中使用它http://codex.wordpress.org/Editing_wp-config.php )。这样,人们就不必深入研究类本身来找到设置数据库连接值的位置。我猜这个可读性因素是这个特定作者决定使用常量的原因。

        【讨论】:

        • 非常感谢您的评论!那么除了让它们在课堂外可用之外没有其他理由吗?由于它们不会被代码的其他部分使用(这就是我想要一个类来管理数据库连接的原因),我会将它们放在构造函数中。再次感谢
        • 是的。与 DeaconDesperado 所说的一致,此时这主要是一种约定,这确实意味着您的 MySQL 连接信息在连接类之外的代码库中可用,这无助于安全性。
        猜你喜欢
        • 2011-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-14
        • 2021-12-24
        • 1970-01-01
        • 1970-01-01
        • 2016-05-16
        相关资源
        最近更新 更多