« Ritorna al blog

Ritorna alla lista completa degli articoli

Mettiti alla prova: utilizzo del pattern design Singleton

PHP - SFIDE - febbraio 04, 2022

Un 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"; 
    }
    
}
Mettiti alla prova: utilizzo del pattern design Singleton