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

Gio*_*ona 5 php oop constructor class constants

我是新来的班,哦。我一直在寻找一个基本的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);
    }
[...]
Run Code Online (Sandbox Code Playgroud)

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

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

要么:

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

}
Run Code Online (Sandbox Code Playgroud)

或使用开关等。

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

Dea*_*ado 4

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

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

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

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

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