получение переменной из публичной области видимости для подключения к базе данных часть 2 - PullRequest
0 голосов
/ 14 октября 2010
$hostname['application'] = '127.0.0.1';
$username['application'] = 'root';
$password['application'] = 'root';
$database['application'] = 'band';
$dbdriver['application'] = 'mysql';

class database
{
    private $hostname;
    private $username;
    private $password;
    protected $database;
    private $dbdriver;

    function __construct( $database )
    {

    }
}

$db = new database( 'application' );

тот же вопрос, что и раньше, но я все еще хочу узнать о том, как сделать простую оболочку pdo.можем ли мы каким-то образом получить $ hostname ['application'] и т. д., просто зная $ x ['database']?я имею в виду то, что я пытаюсь сделать, это поместить , получая переменную из публичной области видимости для подключения к базе данных .но я пытаюсь с разными проблемами.

спасибо, что заглянули.

Ответы [ 4 ]

2 голосов
/ 14 октября 2010

Вместо этого попробуйте ввести зависимость:

$hostname['application'] = '127.0.0.1';
$username['application'] = 'root';
$password['application'] = 'root';
$database['application'] = 'band';
$dbdriver['application'] = 'mysql';

class database {
    private $hostname;
    private $username;
    private $password;
    protected $database;
    private $dbdriver;

    function __construct( $hostname, $username, $password, $database, $driver = 'mysql' ) {
        $this->hostname = $hostname;
        $this->username = $username;
        $this->password = $password;
        $this->database = $database;
        $this->driver = $driver;
    }
}

$dbInstance = new database( $hostname['application'], $username['application'], $password['application'], $database['application'] );

Как правило, вы должны не использовать глобальные переменные.Если вам нужна переменная где-то внутри метода функции или класса, вы должны явно «внедрить» их в качестве аргумента вашей функции / метода.

1 голос
/ 14 октября 2010

Ну, вы должны быть в состоянии получить его от $_GLOBALS, как упомянуто в другой теме.если вы измените свои настройки на что-то вроде:

$settings = array(
  'application' => array(
     'db' => array(
       'dbname' => 'band',
       'driver' => 'mysql',
       'user' => 'root',
       'password' => 'root',
       'host' => '127.0.0.1'
     )
  )
);

Тогда вы легко сможете сделать то, о чем говорите, если я вас правильно понимаю ... например:

class Database
{
    protected $hostname;
    protected $username;
    protected $password;
    protected $database;
    protected $driver;
    protected $dbname;


    function __construct( $database, $options = array())
    {
       $options = array_merge($_GLOBALS['settings'][$application]['db'], $options);
       $this->setOptions($options);
    }

    public function getConnection()
    {
       if(!$this->database)
       {
          $this->database = new PDO($this->getDsn(), $this->username, $this->password);
       }

       return $this->database;
    }

   public function setOptions(array $options)
   {
       foreach($options as $name => $value)
       {
          $method = 'set'.$name;
          if(method_exists($this, $method))
          {
             $this->$method($value);
          }
       }
   }

   public function setHost($host)
   {
     $this->host = $host;
   }

   public function setUsername($username)
   {
     $this->username = $username;
   }

   public function setPassword($password)
   {
     $this->password = $password;
   }

   public function setDriver($driver)
   {
     $this->driver = $driver;
   }

   public function setDbname($dbname)
   {
     $this->dbname = $dbname;
   }

   public function getDsn()
   {
      return sprintf('%s:host=%s;dbname=%s', $this->driver, $this->host, $this->dbname);     
   }

}
0 голосов
/ 14 октября 2010

попробуйте что-то вроде этого:

<?php

final class Constants 
{
    const DB_CHARSET    = "latin1";
    const DB_TIMEOUT    = 15;

    const DB_PORT       = 3306;
    const DB_HOST       = "127.0.0.1";
    const DB_DATABASE   = "foo_db";
    const DB_USER       = "foo_dbo";
    const DB_PASS       = "pass";

    private function __construct(){}
}

final class Database
{
    private $Host = null;
    private $Database = null;
    private $User = null;
    private $Pass = null;
    private $Port = null;

    private $Opened = false;
    private $InTrans = false;

    private $Conn = null; //the connection or link

    public function __construct($conn){
        $this->Host = $conn["host"];
        $this->Database = $conn["database"];;
        $this->User = $conn["user"];;
        $this->Pass = $conn["pass"];;
        $this->Port = $conn["port"];;
    }

    public function Open(){
        //open the database connection as late as possible
    }

    public function Close(){
        //close the database connection as soon as possible
    }

    //lots more methods

}

$conn = array("host"=> Constants::DB_HOST, "user"=> Constants::DB_USER, "pass"=> Constants::DB_PASS, 
             "database"=>Constants::DB_DATABASE, "port"=>Constants::DB_PORT);

$db = new Database($conn);

var_dump($db);

?>
0 голосов
/ 14 октября 2010

Вы делаете это неправильно.

Попытка:

$dbc['hostname'] = '127.0.0.1';
$dbc['username'] = 'root';
$dbc['password'] = 'root';
$dbc['database'] = 'band';
$dbc['dbdriver'] = 'mysql';

$db = new database($db);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...