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


PHP: define constants outside a class or in the constructor?

我是类和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);
}

或者使用开关或其他什么。

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

尽管现在大多数 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. 因此,其他文件/类可以访问定义的值(全局(
  2. 更易于编辑,以防您将来要更改数据库

实现此目的的最佳方法是使用所有这些定义创建一个配置文件。即

配置.php

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

并将它们包含在您的 MySQL 连接类连接中.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);
    }
}

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

在特定

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

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

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

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

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