2010-10-14 35 views
0
$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'); 

toujours la même question que précédemment, mais je veux toujours apprendre comment faire un simple pdo wrapper. pouvons-nous en quelque sorte obtenir $ hostname ['application'], etc en connaissant simplement le $ x ['database']? Je veux dire ce que j'essaie de faire est de mettre getting a variable from a public scope to connect database. mais je suis en train d'essayer avec différents problèmes.obtenir une variable de portée publique pour connecter la partie base de données 2

merci pour la recherche dans

Répondre

1

Eh bien, vous devriez être en mesure de saisir de $_GLOBALS comme mentionné dans l'autre thread. si vous restructurez vos paramètres à quelque chose comme:

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

Ensuite, vous pouvez facilement faire ce que vous êtes parler si je vous comprends bien ... par exemple:

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

wew je n'avais jamais pensé à ça avant. Merci. mettre ['application'] dans les paramètres. Merci! –

+0

btw pouvons-nous appeler cette DI aussi? –

+0

Non, l'utilisation de variables globales n'est pas, par définition, égale à l'injection de dépendance. – Jacco

2

Essayez d'injection de dépendance à la place.

$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']); 

En règle générale, vous devriez pas utiliser des variables globales. Si vous avez besoin d'une variable quelque part dans une fonction ou une méthode de classe, vous devez explicitement les 'injecter' en tant qu'argument à votre fonction/méthode.

+0

Je ne comprends pas, la différence entre DI et l'utilisation globale comme ci-dessus? –

+1

Dans les fonctions PHP, les méthodes et les classes ont leur propre 'espace de nommage'; Pensez à cela comme des pièces séparées dans votre programme. Chaque pièce a une porte d'entrée (l'appel de fonction) et une porte arrière (la valeur de retour). Une bonne pratique consiste à envoyer les variables entrantes par la porte d'entrée (en tant qu'arguments) et à recevoir le résultat à la porte arrière (en tant que valeur de retour). Si vous respectez ce principe, vous n'avez pas à vous soucier de ce qui se passe dans la pièce, juste à l'avant et à l'arrière. – Jacco

+1

Si vous commencez à utiliser des variables globales, vous créez un trou géant dans les murs de votre pièce et commencez à introduire de nouvelles variables quelque part au milieu de votre flux de fonctions. Cela signifie que j'ai besoin de regarder comment la pièce (= fonction ou méthode) «fonctionne» pour savoir à quoi s'attendre en tant que valeur de retour. Et peut-être, la fonction modifie même des variables globales quelque part, je ne peux pas être sûr. Je dois donc examiner chaque ligne pour voir ce qui se passe. – Jacco

0

Vous vous trompez.

Essayez:

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

$db = new database($db); 
0

essayer quelque chose comme ceci:

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

?>