Comment puis-je faire un singleton de l'extension PDO? L'extension ne fonctionne pas, parce que je reçois une erreur fatale quand je l'essaye ...Comment puis-je créer un wrapper singleton pour PDO?
2
A
Répondre
10
Mais pour répondre à cette néanmoins:
Vous ne pouvez pas transformer une visibilité publique à une visibilité plus stricte. Ainsi, PDO ne peut pas avoir la visibilité du constructeur modifiée à autre chose que public. Vous devez donc envelopper l'instance PDO dans un Singleton:
class MyPdo
{
/**
* @var MyPdo
*/
protected static $_instance;
/**
* @var Pdo
*/
protected $_pdo;
/**
* Creates instance and returns it on subsequent calls
*
* @throws InvalidArgumentException
* @param array $options PDO connection data
* @returns MyPdo
*/
public static function getInstance(array $options = NULL)
{
if(self::$_instance === NULL) {
if($options === NULL) {
throw new InvalidArgumentException(
'You must supply connection options on first run');
}
// call constructor with given options and assign instance
self::$_instance = new self(
$options['dsn'],
$options['user'],
$options['password'],
$options['driver_options']
);
}
return self::$_instance;
}
/**
* Creates new MyPdo wrapping a PDO instance
*
* @throws PDOException
* @param String $dsn
* @param String $user
* @param String $password
* @param Array $driver_options
* @return void
*/
private function __construct($dsn, $user, $password, $driver_options)
{
try {
$this->_pdo = new PDO($dsn, $user, $password, $driver_options);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
}
/**
* Singletons may not be cloned
*/
private function __clone() {}
/**
* Delegate every get to PDO instance
*
* @param String $name
* @return Mixed
*/
public function __get($name)
{
return $this->_pdo->$name;
}
/**
* Delegate every set to PDO instance
*
* @param String $name
* @param Mixed $val
* @return Mixed
*/
public function __set($name, $val)
{
return $this->_pdo->$name = $val;
}
/**
* Delegate every method call to PDO instance
*
* @param String $method
* @param Array $args
* @return Mixed
*/
public function __call($method, $args) {
return call_user_func_array(array($this->_pdo, $method), $args);
}
}
Vous utiliseriez comme ceci:
$db = MyPdo::getInstance(array(
'dsn'=>'mysql:dbname=mysql;host=127.0.0.1',
'user' => 'root',
'password' => 'minnymickydaisydonaldplutogoofysanfrancisco',
'driver_options' => array(
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
)));
$version = $db->query('SELECT version();');
echo $version->fetchColumn();
// remove reference to instance
unset($db);
// doesn't require connection data now as it returns same instance again
$db = MyPdo::getInstance();
$version = $db->query('SELECT version();');
echo $version->fetch();
Questions connexes
- 1. Comment créer un wrapper d'objet session C#?
- 2. Utilisation de la méthode singleton pour créer un objet global
- 3. Dois-je créer un constructeur protégé pour mes classes singleton?
- 4. PDO utilisant singleton stocké comme propriété de classe
- 5. Meilleure façon de créer un tableau singleton
- 6. Comment créer un wrapper d'API ultra-simple dans Ruby?
- 7. comment écrire un wrapper pour 'allouer'
- 8. Comment puis-je créer un wrapper pour attendre l'écoute sur un port?
- 9. comment créer un wrapper SETUP.EXE pour un fichier MSI à l'aide de NSIS
- 10. Comment puis-je créer une instance de mon singleton const?
- 11. créer mon propre wrapper de mots pour la chaîne
- 12. créer un wrapper autour d'un assemblage tiers - échanger et déconnecter
- 13. PHP wrapper d'extension pour C++
- 14. Dois-je créer un wrapper autour de cette entité?
- 15. Comment créer une requête paramétrée PDO avec une instruction LIKE?
- 16. Comment créer singleton par demande dans les pylônes?
- 17. Un wrapper .net pour Google App Engine?
- 18. Écrire un script shell wrapper pour awk
- 19. C# Wrapper pour Encoding.com?
- 20. Comment créer une fonction wrapper $() de type jquery?
- 21. Comment rendre mon WPF MainWindow un singleton?
- 22. Windsor MixIn est un singleton?
- 23. Comment faire pour écrire un wrapper API Python?
- 24. vues Drupal: comment mettre un div wrapper pour deux vues?
- 25. Comment créer d'autres classes à partir d'une classe singleton?
- 26. Comment créer une classe Singleton inter-processus en Java
- 27. exemple pour motif Singleton
- 28. Quelle extension PHP devrais-je utiliser pour mon wrapper DB?
- 29. Destructeur pour Singleton
- 30. Écrire un programme wrapper en Java pour adb
Bienvenue sur SO. S'il vous plaît montrer votre code et l'erreur exacte que vous obtenez. –
liées: [Qui a besoin de Singletons] (http://stackoverflow.com/q/4595964/367456) – hakre