Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:在类外或构造函数中定义常量?_Php_Oop_Class_Constructor_Constants - Fatal编程技术网

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

PHP:在类外或构造函数中定义常量?,php,oop,class,constructor,constants,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'); clas

我对课堂和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);
}
或:

或者用开关什么的


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

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

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


通常,我发现人们在代码开始时使用常量来设置最终用户需要修改(通常只修改一次)的值(WordPress在他们的wp-config.php文件中使用)。这样,人们就不必深入类本身来找到在哪里设置DB连接值。我猜这个可读性因素就是这位作者决定使用常量的原因。

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

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

PHP5包含类常量以实现相同的功能,但仅在类本身的范围内

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

尽管PHP中的OOP已经走过了很长的路,并且现在已经广泛使用,但是很多旧的或更“锁定”的框架和库仍然使用define约定,因此您将看到它甚至在OO环境中也非常常用

  • 因此其他文件/类可以访问定义的值(全局)
  • 易于编辑,以防将来更改数据库
  • 实现这一点的最佳方法是创建一个包含所有这些定义的配置文件。 i、 e

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

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


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

    在.ini文件中定义它们如何:p非常感谢您的评论!所以除了让他们在课堂之外没有别的理由了?因为它们不会被代码的其他部分使用(这就是为什么我需要一个类来管理数据库连接),所以我将它们放在构造函数中。再次感谢是的。按照Deacondespredo所说的,这在这一点上主要是一种约定,它确实意味着你的MySQL连接信息在连接类之外的代码库中可用,这对安全性没有帮助。非常感谢,这正是我希望听到的。如果你也在学习,我建议您尽可能多地阅读PHP文档的类章节。它确实有助于理解诸如静态与实例化方法以及对象继承之类的核心内容。即使我的团队早就从PHP切换到Python,PHP文档的质量和范围仍然是我非常怀念的!我自学了php,现在我正在读Peter MacIntyre shop.oreilly.com/product/9780596804381的书。不幸的是,我是意大利人,虽然我熟悉英语,但技术语言对我来说仍然很难:-)
    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);
        }
    }