PHP:在类或构造函数外定义常量?

时间:2011-11-11 17:52:51

标签: php oop class constructor constants

我是班级和oo的新手。 我一直在寻找一个基本的MySQL类,我找到了Matthew Saragusa的“简单的MySQL类”。

这是第一行:

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);

}

或使用开关或其他任何东西。

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

5 个答案:

答案 0 :(得分: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环境中也会看到它非常常用。

答案 1 :(得分:3)

  1. 因此其他文件/类可以访问定义的值(GLOBAL)
  2. 如果您将来要更改数据库,则更容易编辑
  3. 实现此目的的最佳方法是创建包含所有这些定义的配置文件。 即

    的configuration.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);
        }
    }
    

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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