<?php
$settings['hostname'] = '127.0.0.1';
$settings['username'] = 'root';
$settings['password'] = 'root';
$settings['database'] = 'band';
$settings['dbdriver'] = 'mysql';
/**
* DATABASE
*/
class database
{
protected $settings;
function __construct()
{
}
function connect()
{
$this->start = new PDO(
$this->settings['dbdriver'] . ':host='.
$this->settings['hostname'] . ';dbname='.
$this->settings['database'],
$this->settings['username'],
$this->settings['password'],
array(PDO::ATTR_PERSISTENT => true));
$this->start->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
}
}
?>
好吧我还是学生所以今天我要学习范围和连接数据库 问题是我怎样才能将类中的$设置放入类中受保护的$设置中?
答案 0 :(得分:3)
您已经在所显示的代码中的正确路径上:不要使用公共(全局)范围 - 在OOP中依赖全局变量并不是一个好习惯,因为它打破了封装。而是在初始化时将设置注入对象。
您可以添加构造函数来执行此操作:
function __construct($settings)
{
$this->settings = $settings;
}
然后像这样初始化类:
$database= new database($settings);
或者像这样,以防止敏感数据的变量浮动:
$database= new database(array('hostname' => '127.0.0.1',
'username' => 'root',
'password' => 'root',
'database' => 'band',
'dbdriver' => 'mysql'));
作为旁注,在生产使用中,为安全起见,请考虑在连接后从数组中删除password
变量。这不是必要的,但还有一件好事。
答案 1 :(得分:1)
将$settings
作为函数参数传递,使用global
将其导入当前范围,或通过$GLOBALS
访问。
传递为参数:
public function __construct(array $settings) {
$this->settings = $settings;
}
使用global
导入:
public function __construct() {
global $settings;
$this->settings = $settings;
}
使用$GLOBALS
:
public function __construct() {
$this->settings = $GLOBALS['settings'];
}
我会选择传递作为arg变体。其他版本只是肮脏的黑客(imho)。
答案 2 :(得分:0)
更好的方法是查看配置文件(例如XML文件),或者使用所需参数调用connect()方法(或构造函数)。