从公共范围获取变量以连接数据库

时间:2010-10-07 10:52:31

标签: php mysql

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

好吧我还是学生所以今天我要学习范围和连接数据库 问题是我怎样才能将类中的$设置放入类中受保护的$设置中?

3 个答案:

答案 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()方法(或构造函数)。