<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>classi Archivi - Cesare Bordi | Innovation Manager &amp; Back-end Developer</title>
	<atom:link href="https://www.cesarebordi.it/tag/classi/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.cesarebordi.it/tag/classi/</link>
	<description>Innovare con soluzioni software efficaci e gioco di squadra</description>
	<lastBuildDate>Sat, 22 Apr 2023 08:03:29 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.4.2</generator>

<image>
	<url>https://www.cesarebordi.it/wp-content/uploads/2016/02/CB-logo-88x88.png</url>
	<title>classi Archivi - Cesare Bordi | Innovation Manager &amp; Back-end Developer</title>
	<link>https://www.cesarebordi.it/tag/classi/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Design Pattern Builder in Php</title>
		<link>https://www.cesarebordi.it/design-pattern-builder-php/</link>
					<comments>https://www.cesarebordi.it/design-pattern-builder-php/#respond</comments>
		
		<dc:creator><![CDATA[cesarebordi]]></dc:creator>
		<pubDate>Fri, 14 Apr 2023 18:07:24 +0000</pubDate>
				<category><![CDATA[Lezioni]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[classi]]></category>
		<category><![CDATA[contro]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[esempio]]></category>
		<category><![CDATA[guida]]></category>
		<category><![CDATA[metodo]]></category>
		<category><![CDATA[oggetti]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[pro]]></category>
		<category><![CDATA[programmazione]]></category>
		<category><![CDATA[programmazione ad oggetti]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[singleton]]></category>
		<guid isPermaLink="false">https://www.cesarebordi.it/?p=1476</guid>

					<description><![CDATA[<p>Il builder è un design pattern creazionale molto utilizzato. Vediamo come implementarlo in php.</p>
<p>L'articolo <a href="https://www.cesarebordi.it/design-pattern-builder-php/">Design Pattern Builder in Php</a> sembra essere il primo su <a href="https://www.cesarebordi.it">Cesare Bordi | Innovation Manager &amp; Back-end Developer</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Il builder fa parte dei <a href="https://www.cesarebordi.it/design-pattern-gof-guida/" target="_blank" rel="noreferrer noopener">design pattern creazionali</a>, vediamo come <strong>implementarlo correttamente in PHP</strong> partendo dalla definizione data dalla <a href="https://it.wikipedia.org/wiki/Design_Patterns" target="_blank" rel="noreferrer noopener">Gang of Four</a> (GoF).</p>



<blockquote class="wp-block-quote">
<p>Il <strong>Builder pattern</strong> separa la costruzione di un oggetto complesso dalla sua rappresentazione, così che il processo di costruzione possa creare rappresentazioni diverse.</p>
</blockquote>



<p>Il design pattern Builder è un pattern creazionale che viene utilizzato per creare oggetti complessi step by step. Il suo obiettivo principale è quello di separare la costruzione di un oggetto complesso dalla sua rappresentazione, in modo che lo stesso processo di costruzione possa essere utilizzato per creare oggetti differenti.</p>



<p>Il pattern Builder prevede l&#8217;utilizzo dei seguenti elementi:</p>



<ul>
<li><strong>Oggetto Builder</strong> che viene utilizzato per definire le caratteristiche generali e comuni di oggetti omogenei.</li>



<li><strong>Metodi di &#8220;costruzione&#8221;</strong> che permettono di definire nello specifico l&#8217;oggetto finale passo dopo passo.</li>
</ul>



<h2 class="wp-block-heading">Scenari di utilizzo</h2>



<p>Il <strong>pattern Builder </strong>può essere utilizzato ovunque ci sia la necessità di creare oggetti complessi in modo flessibile e modulare, e dove i passaggi di costruzione possono essere suddivisi in metodi più piccoli e gestibili.</p>



<p>Esempi concreti di impiego possono essere:</p>



<ul>
<li><strong>Creazione di oggetti Model</strong>: Il pattern Builder può essere utilizzato per creare oggetti Model complessi passo dopo passo. Ad esempio, se si vuole creare un oggetto Model che rappresenta un Ordine con molti dettagli, il pattern Builder può semplificare il processo di creazione dell&#8217;oggetto suddividendo i passaggi in metodi più piccoli e gestibili.</li>



<li><strong>Costruzione di Query</strong>: Il pattern Builder può essere utilizzato per costruire query SQL complesse in modo flessibile e modulare.</li>



<li><strong>Creazione di oggetti View</strong>: Il pattern Builder può essere utilizzato per creare oggetti View complessi passo dopo passo. </li>
</ul>



<h2 class="wp-block-heading">Esempio di pattern Builder in PHP</h2>



<p>Vediamo ora un <strong>esempio di codice in PHP</strong> che utilizza il pattern <strong>Builder</strong> per creare una classe che funga da <strong>query builder SQL</strong>.</p>



<pre class="wp-block-prismatic-blocks"><code class="language-php">class QueryBuilder {
  private $table;
  private $fields = array();
  private $conditions = array();

  public function table($table) {
    $this-&gt;table = $table;
    return $this;
  }

  public function select($fields) {
    $this-&gt;fields = $fields;
    return $this;
  }

  public function where($field, $operator, $value) {
    $this-&gt;conditions[] = array(
      &#039;field&#039; =&gt; $field,
      &#039;operator&#039; =&gt; $operator,
      &#039;value&#039; =&gt; $value
    );
    return $this;
  }

  public function build() {
    $query = &#039;SELECT &#039; . implode(&#039;, &#039;, $this-&gt;fields) . &#039; FROM &#039; . $this-&gt;table;
    if (!empty($this-&gt;conditions)) {
      $query .= &#039; WHERE &#039;;
      foreach ($this-&gt;conditions as $condition) {
        $query .= $condition[&#039;field&#039;] . &#039; &#039; . $condition[&#039;operator&#039;] . &#039; &#039; . $condition[&#039;value&#039;] . &#039; AND &#039;;
      }
      $query = rtrim($query, &#039; AND &#039;);
    }
    return $query;
  }
}</code></pre>



<p>In questo esempio, la classe QueryBuilder definisce i metodi per creare una query SQL complessa passo dopo passo. Il metodo <code>table</code> imposta la tabella su cui effettuare la query, il metodo <code>select</code> imposta i campi da selezionare, e il metodo <code>where</code> aggiunge una condizione alla clausola WHERE della query. Infine, il metodo <code>build</code> restituisce la query SQL completa.</p>



<p>Vediamo ora come utilizzare il query builder appena creato:</p>



<pre class="wp-block-prismatic-blocks"><code class="language-php">$query = (new QueryBuilder())
          -&gt;table(&#039;products&#039;)
          -&gt;select(array(&#039;id&#039;, &#039;name&#039;, &#039;price&#039;))
          -&gt;where(&#039;price&#039;, &#039;&gt;&#039;, 10)
          -&gt;where(&#039;category&#039;, &#039;=&#039;, &#039;electronics&#039;)
          -&gt;build();
echo $query;
// Output: SELECT id, name, price FROM products WHERE price &gt; 10 AND category = &#039;electronics&#039;

</code></pre>



<p>Nell&#8217;esempio di utilizzo, si crea un oggetto QueryBuilder<strong> </strong>e si chiamano i metodi necessari per costruire la query desiderata, ovvero selezionare l&#8217;id, il nome e il prezzo dei prodotti con un prezzo maggiore di 10 e appartenenti alla categoria &#8216;electronics&#8217;. Infine, si chiama il metodo <code>build</code> per ottenere la query SQL completa.</p>



<h2 class="wp-block-heading">Vantaggi del design pattern builder</h2>



<ul>
<li>Consente di <strong>creare oggetti complessi</strong> step by step, separando la costruzione dell&#8217;oggetto dalla sua rappresentazione e facilitando il processo di creazione.</li>



<li>Permette di <strong>creare oggetti con diverse configurazioni</strong>, utilizzando gli stessi passaggi di costruzione.</li>



<li>Consente di <strong>creare oggetti in modo più flessibile e modulare</strong>, aggiungendo o rimuovendo passaggi di costruzione a seconda delle necessità.</li>



<li>Consente di <strong>migliorare la leggibilità del codice</strong>, in particolare quando si hanno molti parametri da passare al costruttore.</li>
</ul>



<h2 class="wp-block-heading">Svantaggi del design pattern builder</h2>



<ul>
<li>Può <strong>aumentare la complessità del codice</strong>, in particolare se si hanno molti passaggi di costruzione da definire.</li>



<li>Può <strong>richiedere l&#8217;implementazione di molte classi aggiuntive</strong> (interfacce e classi concrete).</li>



<li>Può <strong>introdurre un costo aggiuntivo di tempo di esecuzione</strong> a causa dell&#8217;utilizzo di oggetti intermedi durante il processo di costruzione.</li>
</ul>



<h2 class="wp-block-heading">Conclusioni</h2>



<p>Il pattern Builder è un pattern molto utile e flessibile per la creazione di oggetti complessi, ma deve essere utilizzato con cautela e valutando attentamente le specifiche esigenze del progetto.</p>



<p>Per un panoramica generale sui design pattern consiglio di leggere l&#8217;<a href="https://www.cesarebordi.it/design-pattern-gof-guida/">articolo introduttivo sui <strong>design patterns</strong></a>.</p>
<p>L'articolo <a href="https://www.cesarebordi.it/design-pattern-builder-php/">Design Pattern Builder in Php</a> sembra essere il primo su <a href="https://www.cesarebordi.it">Cesare Bordi | Innovation Manager &amp; Back-end Developer</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.cesarebordi.it/design-pattern-builder-php/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Design Pattern Strategy in Php</title>
		<link>https://www.cesarebordi.it/design-pattern-strategy-php/</link>
					<comments>https://www.cesarebordi.it/design-pattern-strategy-php/#respond</comments>
		
		<dc:creator><![CDATA[cesarebordi]]></dc:creator>
		<pubDate>Wed, 22 Mar 2023 08:43:26 +0000</pubDate>
				<category><![CDATA[Lezioni]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[classi]]></category>
		<category><![CDATA[contro]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[esempio]]></category>
		<category><![CDATA[guida]]></category>
		<category><![CDATA[metodo]]></category>
		<category><![CDATA[oggetti]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[pro]]></category>
		<category><![CDATA[programmazione]]></category>
		<category><![CDATA[programmazione ad oggetti]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[strategy]]></category>
		<guid isPermaLink="false">https://www.cesarebordi.it/?p=1427</guid>

					<description><![CDATA[<p>Lo strategy è tra i design pattern comportamentali più utilizzati. Permette di definire algoritmi e renderli interscambiabili. Vediamo come implementarlo in php.</p>
<p>L'articolo <a href="https://www.cesarebordi.it/design-pattern-strategy-php/">Design Pattern Strategy in Php</a> sembra essere il primo su <a href="https://www.cesarebordi.it">Cesare Bordi | Innovation Manager &amp; Back-end Developer</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Lo <strong>strategy</strong> è tra i <a href="https://www.cesarebordi.it/design-pattern-gof-guida/" target="_blank" rel="noreferrer noopener">design pattern comportamentali</a> più utilizzati nella <strong>programmazione ad oggetti</strong> (<strong>OOP</strong>) soprattutto in approcci <strong>MVC.</strong><br />Vediamo come <strong>implementarlo correttamente in PHP</strong> partendo dalla definizione data dalla <a href="https://it.wikipedia.org/wiki/Design_Patterns" target="_blank" rel="noreferrer noopener">Gang of Four</a> (GoF).</p>



<blockquote class="wp-block-quote">
<p>Lo <strong>Strategy pattern</strong> definisce una famiglia di algoritmi, li incapsula e li rende interscambiabili tra di loro. Strategy permette di variare gli algoritmi indipendentemente dai client che li usano.</p>
</blockquote>



<p>Il <strong>design pattern Strategy</strong> è utile quando si desidera selezionare l&#8217;algoritmo da utilizzare in fase di esecuzione ed è composto da tre elementi fondamentali:</p>



<ul>
<li>L&#8217;<strong>interfaccia o la classe astratta &#8220;Strategy&#8221;</strong>: definisce il contratto che deve essere implementato dalle classi che rappresentano le diverse strategie di algoritmo. L&#8217;interfaccia o la classe astratta può includere un o più metodi, che rappresentano le operazioni che l&#8217;algoritmo deve essere in grado di eseguire.</li>



<li>Le <strong>classi concrete delle strategie</strong>: queste classi implementano l&#8217;interfaccia o la classe astratta &#8220;Strategy&#8221; e rappresentano le diverse implementazioni degli algoritmi.</li>



<li>La <strong>classe &#8220;Context&#8221;</strong>: rappresenta il contesto in cui viene eseguito l&#8217;algoritmo e che utilizza una delle strategie disponibili per l&#8217;esecuzione. La classe &#8220;Context&#8221; deve accettare un&#8217;istanza di una delle classi concrete delle strategie attraverso il costruttore e/o un metodo setter.</li>
</ul>



<h2 class="wp-block-heading">Scenario di utilizzo</h2>



<p>Il <strong>desgin pattern Strategy</strong> è utile in situazioni in cui è necessario avere la possibilità di cambiare il comportamento di un&#8217;operazione in modo flessibile e senza dover modificare il codice dell&#8217;operazione stessa.</p>



<p>Esempi concreti di impiego possono essere:</p>



<ul>
<li><strong>Nel controller di un framework MVC</strong>, è possibile utilizzare il pattern Strategy per incapsulare la logica di business associata a un&#8217;azione specifica. Ad esempio, se un&#8217;azione richiede la validazione dei dati di input, è possibile utilizzare una classe di validazione Strategy per gestire questo compito in modo indipendente dalla logica di business principale.</li>



<li><strong>Nel modello di un framework MVC</strong>, è possibile utilizzare il pattern Strategy per gestire la connessione ai diversi database utilizzati dall&#8217;applicazione. In questo modo, è possibile rendere la scelta del database dinamica e intercambiabile a runtime.</li>



<li><strong>Nel template di un framework MVC</strong>, è possibile utilizzare il pattern Strategy per definire diverse strategie di rendering a seconda del tipo di visualizzazione richiesta. Ad esempio, è possibile utilizzare una classe di rendering HTML per le visualizzazioni web e una classe di rendering JSON per le API REST.</li>
</ul>



<h2 class="wp-block-heading">Esempio di pattern Strategy in PHP</h2>



<p>Supponiamo di dover calcolare il prezzo di un prodotto in un negozio online, ma il prezzo può variare in base a diversi fattori, come il tipo di sconto, le imposte applicabili e le tariffe di spedizione.</p>



<p>Invece di creare un metodo per ogni combinazione possibile di fattori, possiamo utilizzare il design pattern Strategy per creare un insieme di algoritmi, o strategie, che possono essere scelti in fase di esecuzione in base ai fattori specifici.</p>



<p>Vediamo ora il codice di base per <strong>implementare</strong> questo pattern.</p>



<pre class="wp-block-prismatic-blocks"><code class="language-php">// Creazione dell&#039;interfaccia della strategia
interface PricingStrategy {
    public function calculatePrice($product);
}

// Implementazione della prima strategia: nessuno sconto
class NoDiscountStrategy implements PricingStrategy {
    public function calculatePrice($product) {
        return $product-&gt;getPrice();
    }
}

// Implementazione della seconda strategia: sconto del 10%
class TenPercentDiscountStrategy implements PricingStrategy {
    public function calculatePrice($product) {
        return $product-&gt;getPrice() * 0.9;
    }
}

// Implementazione della terza strategia: sconto del 20%
class TwentyPercentDiscountStrategy implements PricingStrategy {
    public function calculatePrice($product) {
        return $product-&gt;getPrice() * 0.8;
    }
}

// Implementazione della classe prodotto
class Product {
    private $price;
    private $pricingStrategy;
    
    public function __construct($price, $pricingStrategy) {
        $this-&gt;price = $price;
        $this-&gt;pricingStrategy = $pricingStrategy;
    }
    
    public function getPrice() {
        return $this-&gt;pricingStrategy-&gt;calculatePrice($this);
    }
    
    public function setPricingStrategy($pricingStrategy) {
        $this-&gt;pricingStrategy = $pricingStrategy;
    }
}

// Utilizzo del codice
$product = new Product(100, new NoDiscountStrategy());
echo $product-&gt;getPrice(); // output: 100

$product-&gt;setPricingStrategy(new TenPercentDiscountStrategy());
echo $product-&gt;getPrice(); // output: 90

$product-&gt;setPricingStrategy(new TwentyPercentDiscountStrategy());
echo $product-&gt;getPrice(); // output: 80</code></pre>



<p>In questo esempio, abbiamo creato un&#8217;interfaccia <code>PricingStrategy</code> che definisce un metodo <code>calculatePrice()</code>, che viene implementato dalle classi <code>NoDiscountStrategy</code>, <code>TenPercentDiscountStrategy</code> e <code>TwentyPercentDiscountStrategy</code>.</p>



<p>Abbiamo quindi creato una classe <code>Product</code> che accetta un oggetto <code>PricingStrategy</code> nel suo costruttore e ha un metodo <code>getPrice()</code> che utilizza la strategia selezionata per calcolare il prezzo del prodotto.</p>



<p>Infine, abbiamo creato un oggetto <code>Product</code> con un prezzo di 100 e senza sconto, e abbiamo utilizzato il metodo <code>setPricingStrategy()</code> per selezionare le altre strategie di sconto e calcolare il prezzo del prodotto in base ad esse.</p>



<h2 class="wp-block-heading">Vantaggi del design pattern strategy</h2>



<ul>
<li>Consente di isolare la logica di business in classi separate, rendendo il codice più modulare e facile da testare.</li>



<li>Permette di sostituire gli algoritmi utilizzati in modo semplice e senza dover modificare il codice esistente.</li>



<li>Favorisce l&#8217;estendibilità del codice, poiché nuovi algoritmi possono essere facilmente aggiunti senza dover modificare la struttura esistente.</li>
</ul>



<h2 class="wp-block-heading">Svantaggi del design pattern strategy</h2>



<ul>
<li>L&#8217;uso del pattern Strategy può portare a un aumento della complessità del codice, poiché richiede la creazione di molte classi aggiuntive.</li>



<li>Il pattern Strategy potrebbe non essere necessario in tutti i casi e potrebbe rappresentare una soluzione eccessiva in alcune situazioni.</li>
</ul>



<h2 class="wp-block-heading">Conclusioni</h2>



<p>Il design pattern Strategy può essere una soluzione potente per creare codice modulare e flessibile, ma deve essere utilizzato con cautela e solo quando è effettivamente necessario.</p>



<p>Per un panoramica generale consiglio di leggere l&#8217;<a href="https://www.cesarebordi.it/design-pattern-gof-guida/">articolo introduttivo sui <strong>design patterns</strong></a>.</p>
<p>L'articolo <a href="https://www.cesarebordi.it/design-pattern-strategy-php/">Design Pattern Strategy in Php</a> sembra essere il primo su <a href="https://www.cesarebordi.it">Cesare Bordi | Innovation Manager &amp; Back-end Developer</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.cesarebordi.it/design-pattern-strategy-php/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Design Pattern Singleton in Php</title>
		<link>https://www.cesarebordi.it/design-pattern-singleton-php/</link>
					<comments>https://www.cesarebordi.it/design-pattern-singleton-php/#respond</comments>
		
		<dc:creator><![CDATA[cesarebordi]]></dc:creator>
		<pubDate>Thu, 21 May 2020 13:11:22 +0000</pubDate>
				<category><![CDATA[Lezioni]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[classi]]></category>
		<category><![CDATA[contro]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[esempio]]></category>
		<category><![CDATA[guida]]></category>
		<category><![CDATA[metodo]]></category>
		<category><![CDATA[oggetti]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[pro]]></category>
		<category><![CDATA[programmazione]]></category>
		<category><![CDATA[programmazione ad oggetti]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[singleton]]></category>
		<guid isPermaLink="false">https://www.cesarebordi.it/?p=962</guid>

					<description><![CDATA[<p>Il singleton è il più conosciuto tra i design pattern creazionali. Vediamo come implementarlo in php e come usarlo nella programmazione ad oggetti (OOP).</p>
<p>L'articolo <a href="https://www.cesarebordi.it/design-pattern-singleton-php/">Design Pattern Singleton in Php</a> sembra essere il primo su <a href="https://www.cesarebordi.it">Cesare Bordi | Innovation Manager &amp; Back-end Developer</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Il <strong>singleton</strong> è tra i <a rel="noreferrer noopener" href="https://www.cesarebordi.it/design-pattern-gof-guida/" target="_blank">design pattern creazionali</a> più conosciuti e sul suo utilizzo nella <strong>programmazione ad oggetti</strong> (<strong>OOP</strong>) ci sono pareri contrastanti. Vediamo come <strong>implementarlo correttamente in PHP</strong> partendo dalla definizione data dalla <a rel="noreferrer noopener" href="https://it.wikipedia.org/wiki/Design_Patterns" target="_blank">Gang of Four</a> (GoF).</p>



<blockquote class="wp-block-quote">
<p>Il <strong>Singleton pattern</strong> assicura che una sola istanza di una classe esista, fornendo un punto di accesso globale a tale istanza.</p>
</blockquote>



<p>Il <strong>pattern Singleton</strong> impedisce la creazione di più istanze di una classe garantendo che ne esista solo una e fornisce un modo per accedere a quell&#8217;istanza unica da qualsiasi parte dell&#8217;applicazione.</p>



<p>Il singleton prevede tre elementi fondamentali:</p>



<ul>
<li><strong>Costruttore privato</strong>: impedisce la creazione di istanze della classe dal di fuori della classe stessa.</li>



<li><strong>Variabile statica privata</strong>: mantiene l&#8217;istanza unica della classe. Deve essere privata per evitare che altri oggetti accedano ad essa direttamente.</li>



<li><strong>Metodo statico di accesso all&#8217;istanza</strong>: restituisce l&#8217;istanza unica della classe. Se l&#8217;istanza non esiste ancora, il metodo crea l&#8217;istanza e la restituisce, altrimenti restituisce semplicemente l&#8217;istanza esistente.</li>
</ul>



<h2 class="wp-block-heading">Scenari di utilizzo</h2>



<p>Il <strong>pattern singleton</strong> può essere utilizzato quando un certo oggetto deve essere &#8220;unico&#8221; all&#8217;interno del nostro applicativo, per un ruolo di coordinamento o per ottimizzare le risorse. Ecco alcuni esempi concreti di utilizzo:</p>



<ul>
<li>Registro / Storage condiviso</li>



<li>Log / Debug</li>



<li>Connessione a DB persistente</li>
</ul>



<h2 class="wp-block-heading">Esempio di pattern Singleton in PHP</h2>



<p>Vediamo ora il codice di base per <strong>implementare</strong> questo pattern.</p>



<pre class="wp-block-prismatic-blocks"><code class="language-php">class MySingleton {

    /**
     * Istanza unica del singleton
     * @var object
     */
    private static object $instance;

    /**
     * Costruttore privato per prevenire che venga istanziato da codice esterno.
     */
    private function __construct() {
        echo &#039;Faccio qualcosa...&#039;;
    }

    /**
     * Metodo pubblico per l&#039;accesso all&#039;istanza unica di classe.
     * @return object|MySingleton
     */
    public static function getInstance() {
        if ( !isset(self::$instance) ) {
            self::$instance = new MySingleton();
        }
        return self::$instance;
    }
}</code></pre>



<p>Se proviamo ad istanziare due volte il singleton noteremo che il messaggio &#8220;Faccio qualcosa&#8230;&#8221; presente nel costruttore verrà mostrato una sola volta. poiché il sistema utilizzato per implementarlo garantisce l&#8217;unicità dell&#8217;istanza (oggetto).</p>



<pre class="wp-block-prismatic-blocks"><code class="language-"></code></pre>



<p>Per rendere il codice più riutilizzabile possiamo apportare una piccola modifica all&#8217;interno del metodo getIstance() in modo che il nome della classe istanziata con <em>new</em> sia valorizzato automaticamente. Sfruttiamo la <strong><a rel="noreferrer noopener" href="https://www.php.net/manual/en/language.constants.predefined.php" target="_blank">costante magica</a> __CLASS__</strong> che restituisce il nome della classe nella quale è richiamata.</p>



<pre class="wp-block-prismatic-blocks"><code class="language-php">if ( !isset(self::$instance) ) {
    $className = __CLASS__;
    self::$instance = new $className;
}</code></pre>



<h2 class="wp-block-heading">Vantaggi del design pattern singleton</h2>



<ul>
<li><strong>Garantisce una sola istanza:</strong> Il pattern Singleton garantisce che una sola istanza di una classe esista in un determinato momento, il che può essere utile in alcune situazioni, ad esempio per gestire le connessioni al database o le impostazioni globali dell&#8217;applicazione.</li>



<li><strong>Facile accesso globale:</strong> Il pattern Singleton fornisce un punto di accesso globale all&#8217;istanza unica, il che significa che possiamo accedere all&#8217;istanza ovunque e in qualsiasi momento senza dover preoccuparci di passare l&#8217;istanza esplicitamente a ogni parte dell&#8217;applicazione.</li>



<li><strong>Riduzione del consumo di memoria:</strong> Poiché una sola istanza esiste in un determinato momento, il pattern Singleton può aiutare a ridurre il consumo di memoria del sistema.</li>
</ul>



<h2 class="wp-block-heading">Svantaggi del design pattern singleton</h2>



<p>Alcuni puristi della programmazione ad oggetti (OOP) possono storcere il naso quando si parla di <strong>singleton</strong> definendolo un anti-pattern. Le principali critiche al singleton sono le seguenti:</p>



<p></p>



<ul>
<li><strong>Viola il Single Responsibility Principle</strong> (SRP) se crea delle dipendenze nei componenti che lo utilizzano. L&#8217;SRP vorrebbe infatti ogni componente assegnato ad una singola funzione o responsabilità.</li>



<li><strong></strong><strong>Difficile da testare</strong> poiché l&#8217;istanza unica esiste in tutta l&#8217;applicazione e non può essere facilmente sostituita con una mock o una versione di prova.</li>



<li><strong>Difficile da estendere</strong> poiché impone l&#8217;esistenza di una sola istanza di una classe in un determinato momento, può essere difficile estendere il pattern se si desidera introdurre più istanze della classe.</li>



<li><strong>Crea accoppiamento forte:</strong> poiché ogni parte dell&#8217;applicazione che utilizza il Singleton dipende dal suo stato globale.</li>



<li><strong>Viene utilizzato erroneamente per sostituire le variabili globali</strong> che, per definizione, non devono essere influenzate dall&#8217;applicativo.</li>
</ul>



<h2 class="wp-block-heading">Conclusioni</h2>



<p>Il singleton si può rivelare molto utile in specifiche situazioni, ma non bisogna abusarne così come non bisogna abusare delle implementazioni statiche nella programmazione ad oggetti. Può essere utile valutare anche altri tipi di soluzioni come la Dependency Injectiono il pattern Factory.</p>



<p>Per un panoramica generale consiglio di leggere l&#8217;<a href="https://www.cesarebordi.it/design-pattern-gof-guida/">articolo introduttivo sui <strong>design patterns</strong></a>.</p>
<p>L'articolo <a href="https://www.cesarebordi.it/design-pattern-singleton-php/">Design Pattern Singleton in Php</a> sembra essere il primo su <a href="https://www.cesarebordi.it">Cesare Bordi | Innovation Manager &amp; Back-end Developer</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.cesarebordi.it/design-pattern-singleton-php/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Design Pattern GoF &#8211; Guida</title>
		<link>https://www.cesarebordi.it/design-pattern-gof-guida-oop/</link>
					<comments>https://www.cesarebordi.it/design-pattern-gof-guida-oop/#respond</comments>
		
		<dc:creator><![CDATA[cesarebordi]]></dc:creator>
		<pubDate>Wed, 20 May 2020 16:42:00 +0000</pubDate>
				<category><![CDATA[Lezioni]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[classi]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[elementi per il riuso di software ad oggetti]]></category>
		<category><![CDATA[esempio]]></category>
		<category><![CDATA[gang of four]]></category>
		<category><![CDATA[gof]]></category>
		<category><![CDATA[guida]]></category>
		<category><![CDATA[metodo]]></category>
		<category><![CDATA[oggetti]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[pro]]></category>
		<category><![CDATA[programmazione]]></category>
		<category><![CDATA[programmazione ad oggetti]]></category>
		<category><![CDATA[script]]></category>
		<guid isPermaLink="false">https://www.cesarebordi.it/?p=1010</guid>

					<description><![CDATA[<p>La conoscenza dei design pattern nello sviluppo di un software è fondamentale quando si passa dalla fase di analisi alla progettazione del design strutturale. </p>
<p>L'articolo <a href="https://www.cesarebordi.it/design-pattern-gof-guida-oop/">Design Pattern GoF &#8211; Guida</a> sembra essere il primo su <a href="https://www.cesarebordi.it">Cesare Bordi | Innovation Manager &amp; Back-end Developer</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>La conoscenza dei <strong>design pattern</strong> nello <strong>sviluppo di un software</strong> è fondamentale nel passaggio dalla fase di analisi alla progettazione del <strong>design strutturale</strong>. </p>



<p>Progettare software ad oggetti è difficile, ma lo è ancora di più renderne i suoi componenti riutilizzabili. La scomposizione dell&#8217;applicativo in <strong>oggetti</strong> deve tener conto di molteplici fattori: <strong>incapsulamento,</strong> <strong>granularità</strong>, <strong>dipendenza</strong>, <strong>performance</strong>, <strong>ridondanza</strong>, <strong>riusabilità</strong>, <strong>modularità</strong>, <strong>estendibilità nel tempo</strong>. </p>



<p>I<strong> design pattern vengono in nostro soccorso</strong> indicandoci soluzioni a problemi ricorrenti così da rendere il nostro codice riutilizzabile e mantenibile.</p>



<h2 class="wp-block-heading">La genesi</h2>



<p>Il concetto di <strong>design pattern</strong> è stato mutuato dall&#8217;<strong>ingegneria del software</strong> direttamente dall&#8217;<strong>architettura</strong>. Fu l&#8217;architetto austriaco Cristopher Alexander a formalizzare tale concetto nel 1977 all&#8217;interno del libro <em>Pattern Language: Towns, Buildings, Construction</em>.</p>



<blockquote class="wp-block-quote">
<p>Il pattern è una <em>soluzione architetturale che può risolvere problemi in contesti eterogenei</em>.</p>
</blockquote>



<p>La trasposizione del concetto di <strong>design pattern</strong> in ambito informatico è attribuita invece alla cosiddetta <strong><a rel="noreferrer noopener" href="https://it.wikipedia.org/wiki/Gang_of_Four_(scrittori)" target="_blank">Gang of Four</a></strong> (<strong>GoF</strong>) formata da Erich Gamma, Richard Helm, Ralph Johnson e John Vlissides. Dopo quatro anni di confronto condensarono tutta la loro esperienza in un libro del 1994 che è diventato la &#8220;Bibbia della programmazione ad oggetti&#8221;: <a rel="noreferrer noopener" href="https://it.wikipedia.org/wiki/Design_Patterns" target="_blank"><strong><em>Design Patterns: elements of reusable object oriented software</em></strong>&#8220;</a> (<em><strong>Elementi per il riuso di software ad oggetti</strong></em>).</p>



<blockquote class="wp-block-quote">
<p>Il design pattern descrive un problema ricorrente e fornisce una soluzione che può essere riutilizzata infinite volte senza doverla applicare mai nello stesso identico modo</p>
</blockquote>



<h2 class="wp-block-heading">Design Pattern: classificazione</h2>



<p>La GoF cataloga i suoi 23 <strong>pattern</strong> suddividendoli in 3 macro categorie:</p>



<ul>
<li><strong>Pattern creazionali</strong>: soluzioni per creare oggetti.</li>



<li><strong>Pattern strutturali</strong>: soluzioni per la composizione strutturale di classi e oggetti.</li>



<li><strong>Pattern comportamentali</strong>: soluzioni per gestire le responsabilità delle classi e degli oggetti.</li>
</ul>



<p>Una seconda classificazione viene fatta in base al loro ambito applicativo:</p>



<ul>
<li><strong>Class pattern</strong>: soluzioni tramite classi e sottoclassi in relazioni statiche tra loro.</li>



<li><strong>Object Pattern</strong>: soluzioni dinamiche basate sugli oggetti.</li>
</ul>



<p>Infine ogni pattern viene descritto in base agli elementi che lo caratterizzano:</p>



<ul>
<li><strong>Nome</strong>/<strong>Alias</strong>: sintentizza l&#8217;essenza del pattern.</li>



<li><strong>Scopo</strong>: cosa fa il pattern.</li>



<li><strong>Motivazione</strong>: scenario del problema e soluzione offerta.</li>



<li><strong>Applicabilità</strong>: situazioni di esempio in cui si può usare il pattern.</li>



<li><strong>Struttura</strong>: rappresentazione grafica delle classi del pattern.</li>



<li><strong>Partecipanti</strong>: classi/oggetti interessati e relative responsabilità</li>



<li><strong>Collaborazioni</strong>: dei partecipanti per poter assumersi le responsabilità.</li>



<li><strong>Conseguenze</strong>: pro e contro del pattern.</li>



<li><strong>Implementazione</strong>: tecniche e consigli per implementare il pattern.</li>



<li><strong>Codice d&#8217;esempio</strong>: in C++ e SmallTalk.</li>



<li><strong>Utilizzi noti</strong>: esempi reali in sistemi esistenti.</li>



<li><strong>Correlazioni</strong>: legami con altri pattern e differenze.</li>
</ul>



<p>I 23 pattern definiti dal GoF possono essere quindi così schematizzati:</p>



<style>
#containerDesignPattern {border: 1px dashed #999 !important;}
#tableDesignPattern {width:100%; margin:0 !important; }
#tableDesignPattern * {text-align:center; color:#fff}
#tableDesignPattern td { border:8px solid #fff !important; margin:5px !important;}
.color-fff { background: #fff !important; }
.color-444 { background: #444 !important; }
.color-669 { background: #669 !important; }
.color-f30 { background: #f30 !important; }
.color-630 { background: #630 !important; }
</style>
<div id="containerDesignPattern">
<table id="tableDesignPattern">
  <tbody><tr>
    <td colspan="3" class="color-444"><h2 style="margin:0">GoF Design Patterns</h2></td>
  </tr>
  <tr>
    <td width="33%" class="color-669">CREAZIONALI<br />(creational)</td>
    <td width="33%" class="color-f30">STRUTTURALI<br />(structural)</td>
    <td width="33%" class="color-630">COMPORTAMENTALI<br />(behavioral)</td>
  </tr>
  <tr>
    <td colspan="3" class="color-444">Class Scope</td>
  </tr>
  <tr>
    <td class="color-669">Factory Method</td>
    <td class="color-f30">Adapter-class</td>
    <td class="color-630">Interpreter</td>
  </tr>
  <tr>
    <td class="color-fff"></td>
    <td class="color-fff"></td>
    <td class="color-630">Template Method</td>
  </tr>
  <tr>
    <td colspan="3" class="color-444">Object Scope</td>
  </tr>
  <tr>
    <td class="color-669">Abstract Factory</td>
    <td class="color-f30">Adapter-object</td>
    <td class="color-630">Chain of responsibility</td>
  </tr>
  <tr>
    <td class="color-669"><a href="https://www.cesarebordi.it/design-pattern-builder-php/" title="Design Pattern Builder">Builder [<i class="fas fa-graduation-cap"></i>]</a></td>
    <td class="color-f30">Bridge</td>
    <td class="color-630">Command</td>
  </tr>
  <tr>
    <td class="color-669">Prototype</td>
    <td class="color-f30">Composite</td>
    <td class="color-630">Iterator</td>
  </tr>
  <tr>
    <td class="color-669"><a href="https://www.cesarebordi.it/design-pattern-singleton-php/" title="Design Pattern Singleton">Singleton [<i class="fas fa-graduation-cap"></i>]</a></td>
    <td class="color-f30">Decorator</td>
    <td class="color-630">Mediator</td>
  </tr>
  <tr>
    <td class="color-fff">&nbsp;</td>
    <td class="color-f30">Facade</td>
    <td class="color-630">Memento</td>
  </tr>
  <tr>
    <td class="color-fff">&nbsp;</td>
    <td class="color-f30">Flyweight</td>
    <td class="color-630">Observer</td>
  </tr>
  <tr>
    <td class="color-fff">&nbsp;</td>
    <td class="color-f30">Proxy</td>
    <td class="color-630">State</td>
  </tr>
  <tr>
    <td class="color-fff">&nbsp;</td>
    <td>&nbsp;</td>
    <td class="color-630"><a href="https://www.cesarebordi.it/design-pattern-strategy-php/" title="Design Pattern Strategy">Strategy [<i class="fas fa-graduation-cap"></i>]</a></td>
  </tr>
  <tr>
    <td class="color-fff">&nbsp;</td>
    <td class="color-fff">&nbsp;</td>
    <td class="color-630">Visitor</td>
  </tr>
</tbody></table>
</div>



<h2 class="wp-block-heading">Design Pattern: il catalogo della GoF</h2>



<p>Riporto qui una sintesi del <strong>catalogo</strong> composto dai <strong>23 design pattern</strong> in modo da avere un&#8217;idea di massima del loro utilizzo.<br />Ricordo che con il termine &#8220;<strong><a rel="noreferrer noopener" href="https://it.wikipedia.org/wiki/Interfaccia_(informatica)#Interfaccia_nella_programmazione_orientata_agli_oggetti" target="_blank">interfaccia</a></strong>&#8221; si intende qui l&#8217;<strong>insieme delle richieste a cui un oggetto può rispondere</strong> cioè l&#8217;<strong>insieme delle proprietà e dei metodi pubblici di un oggetto.</strong> Attenzione quindi a non confondersi con le &#8220;interface&#8221; di Php!</p>



<ul>
<li><strong>Abstract Factory</strong>: fornisce un&#8217;interfaccia per la creazione di famiglie di oggetti correlati o dipendenti senza specificare o conoscere le classi concrete.</li>



<li><strong>Adapter</strong>: converte l&#8217;interfaccia di una classe in un&#8217;altra interfaccia richiesta dal client permettendo la collaborazione fra classi  tra loro incompatibili.</li>



<li><strong>Bridge</strong>: disaccoppia un&#8217;astrazione dalla sua implementazione in modo che le due possano variare indipendentemente.</li>



<li><strong><a href="https://www.cesarebordi.it/design-pattern-builder-php/">Builder</a></strong>: separa la costruzione di un oggetto complesso dalla sua rappresentazione così che lo stesso processo di creazione possa creare rappresentazioni diverse.</li>



<li><strong>Chain of Responsability</strong>: disaccoppia il mittente di una richiesta dal suo destinatario. Si ordinano gli oggetti destinatari e la richiesta viene passata di oggetto in oggetto finché non viene gestita.</li>



<li><strong>Command:</strong> incapsula una richiesta in un oggetto.</li>



<li><strong>Composite</strong>: raggruppa oggetti in strutture ad albero permettendo ai client di trattare oggetti singoli e raggruppamenti in modo uniforme.</li>



<li><strong>Decorator:</strong> aggiunge dinamicamente responsabilità ad un oggetto. E&#8217; un&#8217;aternativa flessibile all&#8217;ereditarietà.</li>



<li><strong>Facade</strong>: definisce un&#8217;interfaccia di più alto livello per facilitare l&#8217;utilizzo di un sottosistema più complesso.</li>



<li><strong>Factory Method</strong>: permette ad una classe di delegare la creazione di un oggetto alle sue sottoclassi.</li>



<li><strong>Flyweight</strong>: usa la condivisione per gestire numerosi oggetti a granularità fine.</li>



<li><strong>Interpreter</strong>: permette di implementare un proprio linguaggio con la sua grammatica ed il relativo interprete.</li>



<li><strong>Iterator</strong>: permette di accedere agli elementi di un contenitore sequenzialmente senza esporre la struttura sottostante.</li>



<li><strong>Mediator</strong>: favorisce un basso accoppiamento evitando che gli oggetti facciano riferimento l&#8217;un l&#8217;altro.</li>



<li><strong>Memento</strong>: esplicita lo stato interno di un oggetto così da poterlo riportare al suo stato originale.</li>



<li><strong>Observer</strong>: definisce una dipendenza uno-a-molti fra oggetti così che quando un oggetto cambia stato tutti gli oggetti dipendenti vengano notificati ed aggiornati.</li>



<li><strong>Prototype</strong>: specifica gli oggetti da creare utilizzando un&#8217;istanza prototipale.</li>



<li><strong>Proxy</strong>: fornisce un surrogato di un oggetto pper controllare l&#8217;accesso a quest&#8217;ultimo.</li>



<li><a href="https://www.cesarebordi.it/design-pattern-singleton-php/"><strong>Singleton</strong></a>: forza una classe ad avere una sola istanza e ne fornisce un accesso globale.</li>



<li><strong>State</strong>: permette ad un oggetto di modificare il proprio comportamento quando il suo stato interno cambia. Sembrerà che l&#8217;oggetto abbia cambiato la sua classe.</li>



<li><strong><a href="https://www.cesarebordi.it/design-pattern-strategy-php/">Strategy</a></strong>: definisce una famiglia di algoritmi, li incapsula e li rende interscambiabili tra di loro.</li>



<li><strong>Template Method</strong>: definisce lo scheletro principale dell&#8217;algoritmo in un metodo delegando alcuni passi alle sottoclassi.</li>



<li><strong>Visitor</strong>: permette di definire nuove operazioni senza cambiare le classi degli elementi su cui opera.</li>
</ul>



<h2 class="wp-block-heading">Riferimenti</h2>



<p><strong>Design Patterns: Elements of Reusable Object-Oriented Software</strong><br />Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides<br />Pearson Education</p>



<p><a href="https://designpatternsphp.readthedocs.io">https://designpatternsphp.readthedocs.io</a></p>



<p><a href="https://refactoring.guru/design-patterns">https://refactoring.guru/design-patterns</a></p>
<p>L'articolo <a href="https://www.cesarebordi.it/design-pattern-gof-guida-oop/">Design Pattern GoF &#8211; Guida</a> sembra essere il primo su <a href="https://www.cesarebordi.it">Cesare Bordi | Innovation Manager &amp; Back-end Developer</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.cesarebordi.it/design-pattern-gof-guida-oop/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Php Namespaces</title>
		<link>https://www.cesarebordi.it/php-namespaces/</link>
					<comments>https://www.cesarebordi.it/php-namespaces/#comments</comments>
		
		<dc:creator><![CDATA[cesarebordi]]></dc:creator>
		<pubDate>Thu, 16 Apr 2020 13:35:24 +0000</pubDate>
				<category><![CDATA[Articoli]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[class]]></category>
		<category><![CDATA[classi]]></category>
		<category><![CDATA[codice]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[constant]]></category>
		<category><![CDATA[costanti]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[esempi]]></category>
		<category><![CDATA[function]]></category>
		<category><![CDATA[funzioni]]></category>
		<category><![CDATA[guida]]></category>
		<category><![CDATA[interfacce]]></category>
		<category><![CDATA[interface]]></category>
		<category><![CDATA[namespaces]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programmatore]]></category>
		<category><![CDATA[programmazione]]></category>
		<category><![CDATA[programmazione ad oggetti]]></category>
		<category><![CDATA[web developer]]></category>
		<guid isPermaLink="false">https://www.cesarebordi.it/?p=572</guid>

					<description><![CDATA[<p>I namespaces in PHP rappresentano un'innovazione ed hanno legami stretti con lo standard PSR-4 e l'autoloading delle classi.</p>
<p>L'articolo <a href="https://www.cesarebordi.it/php-namespaces/">Php Namespaces</a> sembra essere il primo su <a href="https://www.cesarebordi.it">Cesare Bordi | Innovation Manager &amp; Back-end Developer</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<p class="has-text-align-left has-text-align-justify">L&#8217;introduzione dei <strong>namespaces </strong>in <strong>PHP</strong> rappresenta un&#8217;innovazione nel <strong>linguaggio </strong>ed ha legami stretti con lo <strong><a rel="noreferrer noopener" aria-label=" (apre in una nuova scheda)" href="https://www.php-fig.org/psr/psr-4/" target="_blank">standard PSR-4</a></strong> e l&#8217;<strong>autoloading delle classi</strong>.  A livello teorico l&#8217;argomento può sembrare semplice, ma nell&#8217;<strong>implementazione del codice</strong> non è così immediato.</p>
</div></div>



<h2 class="wp-block-heading">Cosa sono i namespaces in php?</h2>



<blockquote class="wp-block-quote"><p>What are namespaces? In the broadest definition namespaces are a way of encapsulating items.</p></blockquote>



<p>I <strong><a href="https://www.php.net/manual/en/language.namespaces.rationale.php">namespaces</a></strong>, introdotti in <strong>PHP 5.3</strong> e migliorati in<strong> PHP 7</strong>, permettono di <strong>raggruppare </strong><span style="text-decoration: underline;"><strong>classi</strong></span>, <span style="text-decoration: underline;"><strong>interfacce</strong></span>, <span style="text-decoration: underline;"><strong>funzioni</strong></span> e<strong> </strong><span style="text-decoration: underline;"><strong>costanti</strong></span> per evitare ambiguità di denominazione. In questo modo potremo far coesistere classi <span style="text-decoration: underline;">con lo stesso nome</span> &#8220;incapsulate&#8221; in namespace differenti esattamente come avviene per file con lo stesso nome posti in cartelle diverse del filesystem.  La possibilità di creare una gerarchizzazione (<strong>sub-namespace</strong>) fornisce una chiara indicazione sull&#8217;organizzazione delle risorse del nostro applicativo.  Ad esempio, assegnando i namespaces <em><strong><code>Framework\Core\Main</code></strong></em> ad un file contenente una classe e <em><strong><code>Framework\Core\Main\Libs</code></strong></em> ad un altro contenente un&#8217;altra classe con il medesimo nome, è facilmente intuibile come la prima si riferisca alle funzionalità di base del nostro ipotetico framework e l&#8217;altra sia presente in una libreria secondaria.</p>



<p>Pur essendo forte l&#8217;analaogia con il filesystem <strong>non sussite alcuna relazione diretta fra un namespace ed il percorso dei file .php</strong>. E&#8217; però intuitivo utilizzare questa analogia per creare vincoli convenzionali e sfruttarli nella pratica dell&#8217;autoloading la cui implementazione più diffusa è sintetizzata nello standard <a rel="noreferrer noopener" aria-label=" (apre in una nuova scheda)" href="https://www.php-fig.org/psr/psr-4/" target="_blank">PSR-4</a> che approfondirò in un altro articolo.</p>



<h2 class="wp-block-heading">Namespaces: vantaggi di utilizzo</h2>



<ul><li><strong>Risolvono il problema di omonimia</strong> di <span style="text-decoration: underline;">classi, interfacce, funzioni e costanti</span> tra il codice scritto dallo sviluppatore, quello integrato in librerire di terze parti e quello nativo di Php.</li><li><strong>Facilitano lo sviluppo di codice ordinato</strong>, organizzato ed &#8220;eloquente&#8221;.</li><li><strong>Migliorano la leggibilità e la scrittura del codice</strong> permettendo di utilizzare degli <strong>alias </strong>nel momento in cui la precisa ed inevitabile lunghezza del namespace non fosse necessaria.</li></ul>



<h2 class="wp-block-heading">Namespaces: dichiarazione</h2>



<p>Compresi i vantaggi  del loro utilizzo vediamo come utilizzare i namespaces iniziando dalla loro dichiarazione attraverso l&#8217;apposita <span style="text-decoration: underline;">keyword <code>&lt;strong&gt;namespace&lt;/strong&gt;</code></span>.<br />Uno script che faccia uso di namespaces deve dichiararlo all&#8217;inizio del listato fatta eccezione per i commenti ed eventuali istruzioni <em>declare</em>.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
&lt;?php
declare(encoding='UTF-8');

// Dichiaro il namespace...
namespace Framework\Core\Main;
</pre></div>


<h3 class="wp-block-heading">Attenzione!</h3>



<ul><li>I namespaces<strong> non possono contenere keywords</strong> del linguaggio php.<br /><strong><em><code>Framework\Core\&lt;s&gt;Class&lt;/s&gt;</code></em></strong></li><li>I namespaces <strong>non possono iniziare con un numero</strong>.<br /><em><strong><code>Framework\Core\&lt;s&gt;1Class&lt;/s&gt;</code></strong></em></li><li>E&#8217; possibile, ma altamente<strong> sconsigliato, dichiarare più namespaces nello stesso file</strong> utilizzando le parentesi graffe.<br /><code>&lt;?php&lt;br /&gt;&lt;em&gt;&lt;strong&gt;Framework\Core\Main&lt;/strong&gt;&lt;/em&gt; { // codice }&lt;br /&gt;&lt;em&gt;&lt;strong&gt;Framework\Core\Libs&lt;/strong&gt;&lt;/em&gt; { // codice }</code></li></ul>



<h2 class="wp-block-heading">Php Namespaces: dalla teoria alla pratica</h2>



<p>Immaginiamo di creare ed includere due file php contenenti la dichiarazione di una classe denominata nello stesso modo (Es: <code>MyClass</code>). Una volta in esecuzione otterremmo questo errore:<br /><code>&lt;strong&gt;Fatal error&lt;/strong&gt;:  Cannot declare class MyClass, because the name is already in use</code></p>



<p>Aggiungiamo ora ai due file una dichiarazione namespace&#8230;</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
&lt;?php // File 1: /Framework/Core/Main/MyClass.php

namespace Framework\Core\Main;

Class MyClass {
    public function __construct() {
        echo '&lt;p&gt;MAIN: MyClass ready!&lt;/p&gt;';
    }
}
</pre></div>

<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
&lt;?php // File 2: /Framework/Core/Main/Libs/MyClass.php

namespace Framework\Core\Main\Libs;

Class MyClass {
    public function __construct() {
        echo '&lt;p&gt;LIBS: MyClass ready!&lt;/p&gt;';
    }
}
</pre></div>


<p>Creiamo ora il file principale ex01.php che li includerà e tenterà di creare un oggetto.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
&lt;?php // File: /ex01.php

// Includo i file
require_once('Framework/Core/Main/MyClass.php');
require_once('Framework/Core/Main/Libs/MyClass.php');

// Creo l'oggetto
$objOne = New MyClass();
</pre></div>


<p>Mandandolo in esecuzione ci troveremo davanti ancora un errore&#8230;<br /><code>&lt;strong&gt;Fatal error&lt;/strong&gt;:  Uncaught Error: Class &#039;MyClass&#039; not found in...</code></p>



<p>Questo si verifica poichè le nostre due classi &#8220;MyClass&#8221; sono assegnate ai rispettivi namespaces, mentre il nostro file principale non ha alcun namespace specificato e si riferisce quindi a quello globale in cui la classe MyClass() non è definita.</p>



<h2 class="wp-block-heading">Namespaces: tipi di riferimento</h2>



<p>Sappiamo definire i namespaces, ma per richiamarli correttamente dobbiamo conoscere quali sono i <strong>tipi di riferimento</strong> che possiamo utilizzare e che nuovamente hanno una forte analogia con i percorsi dei filesystem:</p>



<ul><li><strong>Unqualified name</strong> (nomi non qualificati): si riferiscono solo al namespace corrente.  È come cercare un fille nella cartella in cui ci si trova.<br /><code>MyClass()</code></li><li><strong>Qualified name</strong> (nomi qualificati): paragonabile al percorso relativo di un file.<br /><code>Main\Libs\MyClass()</code></li><li><strong>Fully-qualified name</strong> (nomi completamente  qualificati): inizia sempre con un backslash iniziale ed è paragonabile ad un percorso assoluto.  È il modo  più sicuro anche se più verboso. <br /><code>\Framework\Core\Main\Libs\MyClass()</code></li></ul>



<p><strong>Unqualified name</strong> &#8211; Nel file principale (ex02.php) dichiariamo lo stesso namespace di uno dei due file contenenti la dichiarazione di MyClass() che vorremmo richiare, ad esempio Libs: <code>Framework\Core\Main\Libs</code>. Ecco finalmente il primo risultato positivo!</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
&lt;?php // File: /ex02.php

// Dichiaro il namespace
namespace Framework\Core\Main\Libs;

// Includo i file
require_once('Framework/Core/Main/MyClass.php');
require_once('Framework/Core/Main/Libs/MyClass.php');

// UNQUALIFIED NAME...
$objOne = New MyClass();
</pre></div>


<p><strong>Qualified name</strong> &#8211; Nel file principale (ex03.php) dichiariamo un namespace più generico <code>Framework\Core</code> ed utilizzamo nomi qualificati per riferirci ad entrambe le nostre classi ed ottenere i relativi oggetti.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
&lt;?php
// File: /ex03.php

// Dichiaro il namespace
namespace Framework\Core;

require_once('Framework/Core/Main/MyClass.php');
require_once('Framework/Core/Main/Libs/MyClass.php');

// QUALIFIED NAME...
$objOneMain = New Main\MyClass();
$objOneLib = New Main\Libs\MyClass();
</pre></div>


<p><strong>Nota</strong>: una volta dichiarato un namespace, per riferirsi al contesto globale è necessario anteporre il backslash.</p>



<p><strong>Fully-qualified name</strong> &#8211;  Nel file principale (ex04.php) omettiamo il namespace, ma utilizziamo un nome completamente qualificato per riferirci alle due classi.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
&lt;?php // File: /ex04.php

// Includo i file
require_once('Framework/Core/Main/MyClass.php');
require_once('Framework/Core/Main/Libs/MyClass.php');

// FULLY-QUALIFIED NAME...
$objOneMain = New \Framework\Core\Main\MyClass();
$objOneLib = New \Framework\Core\Main\Libs\MyClass();
</pre></div>


<h2 class="wp-block-heading">Php Namespaces: importazione e aliasing tramite l&#8217;operatore &#8220;use&#8221;</h2>



<p>Una caratteristica importante dei namespaces è la possibilità di essere importati e di creare degli alias per renderne più pratico l&#8217;utilizzo vista la loro &#8220;eloquenza&#8221;. Queste funzioni trovano un parallelismo nella capictà dei filesystem di creare link simbolici a file o cartelle.<br />A tale scopo Php mette a disposizione la <span style="text-decoration: underline;">keyword <code>&lt;strong&gt;use&lt;/strong&gt;</code></span> con la quale è possibile eseguire i seguenti tipi di seguenti tipi di importazione/aliasing:</p>



<ul><li>nomi di classi o interfacce (<code>use Name\Space\ClassName</code>),  </li><li>nomi di classi o interfacce globali (<code>use DateTime</code>)</li><li>namespaces (use <code>Name\Space\For\...</code>)</li><li>nomi di funzioni (<code>use&nbsp;function Name\Space\FunctionName</code>)</li><li>nomi di costanti (<code>use&nbsp;const&nbsp;Name\Space\CONSTANT</code>).</li></ul>



<p>E&#8217; possibile importare anche più elementi nello stesso file purché non si generino delle ambiguità, in tal caso si potrà ricorrere agli alias. </p>



<p>Applichiamo <code>use</code> al nostro scenario di esempio (ex05.php) per importare i namespaces comuni alla due classi e sintetizzarli in &#8220;Main&#8221;.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
&lt;?php // File: /ex05.php

use Framework\Core\Main as Main;

// Includo i file
require_once('Framework/Core/Main/MyClass.php');
require_once('Framework/Core/Main/Libs/MyClass.php');

// QUALIFIED NAME...
$objOneMain = New Main\MyClass();
$objOneLib = New Main\Libs\MyClass();
</pre></div>


<p>Nell&#8217;esempio seguente (ex06.php) utilizziamo <code>use</code> per superare l&#8217;ambiguita dei nomi delle classi e creare un alias dei namespaces.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
&lt;?php // File: /ex06.php

use Framework\Core\Main\MyClass as MainMy;
use Framework\Core\Main\Libs\MyClass as LibsMy;

// Includo i file
require_once('Framework/Core/Main/MyClass.php');
require_once('Framework/Core/Main/Libs/MyClass.php');

// UNQUALIFIED NAME...
$objOneMain = New MainMy();
$objOneLib = New LibsMy();
</pre></div>


<p>Direi sia tutto! Qui trovate i file di esempio visti nella lezione e se l&#8217;articolo è stato utile&#8230; condividilo!</p>



<div class="wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex">
<div class="wp-block-button"><a class="wp-block-button__link has-text-color has-white-color has-background has-black-background-color" href="https://www.cesarebordi.it/lessons/downloads/namespaces.zip" target="_blank" rel="noreferrer noopener">SCARICA I FILE DI ESEMPIO: namespaces.zip</a></div>
</div>
<p>L'articolo <a href="https://www.cesarebordi.it/php-namespaces/">Php Namespaces</a> sembra essere il primo su <a href="https://www.cesarebordi.it">Cesare Bordi | Innovation Manager &amp; Back-end Developer</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.cesarebordi.it/php-namespaces/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
