用 define() 存储数据库连接细节是好是坏?

Is it good or bad to store the DB connection details with define()?

用 define() 存储数据库连接细节是好是坏?

define( 'DB_HOST', 'localhost' );
define( 'DB_USER', 'root' );
define( 'DB_PASS', 'xxx' );
define( 'DB_NAME', 'xxx' ); 

或在下面的数组中更好?

$config['db'] = array(
    'driver'   => 'mysql',
    'host'     => 'localhost',
    'port'     => '3306',
    'user'     => 'someuser',
    'password' => 'SuperSecretPassword',
    'name'     => 'db_name',
);

我注意到 Zend 或 Symfony 等流行框架不使用 define 进行此配置。

CodeIgniter,

$db['default']['hostname'] = 'localhost';
$db['default']['username'] = '';
$db['default']['password'] = '';
$db['default']['database'] = '';
...

将其存储在数组中而不是 define() 有哪些好处?我注意到 Zend 似乎 根本没有 使用 define()(我可能是错的,因为我是 Zend 的新手)。 一般来说,存储一些全局常量不好吗?

以我有限的知识,我确实发现存储一些全局常量很有用,例如,我可以将我的文档根目录存储在下面,然后我可以从任何地方访问它 - 只需使用 WEBSITE_DOCROOT

define ( 'WEBSITE_DOCROOT', str_replace( '\', '/', dirname( __FILE__ ) ).'/' );

不像下面这个方法,我每次都得用dirname(__FILE__)

// Load config file
$configFile = dirname(__FILE__) . '/../share/config/default.php';

我可以使用 WEBSITE_DOCROOT . '/../share/config/default.php'; 调用该文件。是不是更简单和一致?

  • 在整个应用程序中使用常量可能非常适合存储像 base-url 这样的信息,我真的看不出有什么理由不使用它们,这就是它们的目的。
  • 改用数组是偏好和设计(架构)问题,大多数框架使用数组的原因是使用数组存储数据更方便(显然)
  • 使用全局常量一点也不坏,如果你觉得它对你有用,那么一定要用它来为你带来好处,我可以想象,随着时间的推移,你会明白为什么其他人更喜欢数组方法。

但是,为了保证您的凭据安全,我建议使用 dotenv 我认为这可能是最好的方法。

祝你好运。

必须在您的 PHP 项目之外设置配置和参数
您必须记住,这种工作可以由非开发人员管理,对 PHP 编程一无所知
为此使用一些标准的东西:比如 XML、属性或 conf 文件

没有限制使用 define 而不是 array。 框架将 arrays 用于数据库连接函数,因为它们希望有一些 optional 参数,例如 encoding。另一个原因是不需要 define 这些常量并为它们节省内存,而你只需要它们一次(在 bootstrap.php)。 define 的想法是到处访问 const,但对于数据库配置,您不需要它。

*最好将数据库配置存储在具有 read-onlynot executable 权限的文件中 apache 并拒绝其他用户的所有访问。所以这个文件不能是 php 文件。您可以使用 xmlini 或其他标准格式