« Ritorna al blog
Ritorna alla lista completa degli articoli
Mettiti alla prova: utilizzo del pattern design Singleton
PHP - SFIDE - febbraio 04, 2022Un singleton è una classe che può essere istanziata solo una volta e può esserci solo un oggetto che utilizzi tale classe. Essendo un pattern design ha bisogno di due requisiti fondamentali:
- un costruttore privato (o protetto) in modo da non permettere altre istanze della stessa classe;
- un metodo statico come punto di accesso per creare l'oggetto che ci interessa;
In questo esercizio utilizzeremo il Singleton per stabilire i parametri di connessione ad un ipotetico database, in quanto abbiamo bisogno che questi dati siano unici per tutto l'applicativo.
start.php
<?php include_once('classi/db_settings.start.php'); ?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>singleton</title>
</head>
<body>
<?php
$db1 = db_settings::set_db("localhost", "myuusername77", "mypassword1","database1");
printf(
"Hostname: %s - Username: %s - Password: %s - Nome database: %s",
$db1->get_hostname(),
$db1->get_username(),
$db1->get_password(),
$db1->get_db_name()
);
echo "<br>";
// Se provo a creare un altro oggetto mi dovrebbe dare sempre il primo oggetto che è stato creato
$db2 = db_settings::set_db("localhost:80", "myuusername99", "mypassword2","database2");
printf(
"Hostname: %s - Username: %s - Password: %s - Nome database: %s",
$db2->get_hostname(),
$db2->get_username(),
$db2->get_password(),
$db2->get_db_name()
);
echo "<br>";
?>
</body>
</html>
db_settings.start.php
<?php
class db_settings
{
private static $db;
private $hostname;
private $username;
private $password;
private $db_name;
// da correggere e completare
private function __construct()
{
}
// da correggere e completare
public static function set_db()
{
self::$db = new db_settings();
return self::$db;
}
public function get_hostname()
{
return !empty($this->hostname) ? $this->hostname : "null";
}
public function get_username()
{
return !empty($this->username) ? $this->username : "null";
}
public function get_password()
{
return !empty($this->password) ? $this->password : "null";
}
public function get_db_name()
{
return !empty($this->db_name) ? $this->db_name : "null";
}
}
Una volta creato i file e controllato il collegamento alla classe dovremo avere il seguente output:
Hostname: null - Username: null - Password: null - Nome database: null
Hostname: null - Username: null - Password: null - Nome database: null
Nonostante nel file start.php si provi a creare uno o più oggetti db i valori non vengono correttamente impostati. Dovrete quindi lavorare solo sul file db_settings.start.php affinché riusciate a produrre il seguente output:
Hostname: localhost - Username: myuusername77 - Password: mypassword1 - Nome database: database1
Hostname: localhost - Username: myuusername77 - Password: mypassword1 - Nome database: database1
Nonostante il codice provi a creare un nuovo oggetto con valori diversi avremo sempre i valori del primo oggetto creato.
Buon lavoro e soprattutto divertitevi :)
db_settings.finish.php
<?php
class db_settings {
private static $db;
private $hostname;
private $username;
private $password;
private $db_name;
private function __construct($hostname, $username, $password, $db_name)
{
$this->hostname = $hostname;
$this->username = $username;
$this->password = $password;
$this->db_name = $db_name;
}
public static function set_db($hostname, $username, $password, $db_name){
if(!isset(self::$db)){
self::$db = new db_settings($hostname, $username, $password, $db_name);
}
return self::$db;
}
public function get_hostname()
{
return !empty($this->hostname) ? $this->hostname : "null";
}
public function get_username()
{
return !empty($this->username) ? $this->username : "null";
}
public function get_password()
{
return !empty($this->password) ? $this->password : "null";
}
public function get_db_name()
{
return !empty($this->db_name) ? $this->db_name : "null";
}
}