<?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>Alessio Mavica</title>
	<atom:link href="http://www.alessiomavica.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.alessiomavica.com</link>
	<description>PHP &#38; MySQL Developer, Project Leader &#38; Scrum Master</description>
	<lastBuildDate>Sat, 07 Apr 2012 13:18:30 +0000</lastBuildDate>
	<language>it</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>PHP alcune best practices</title>
		<link>http://www.alessiomavica.com/it/2012/04/07/php-some-best-practices/</link>
		<comments>http://www.alessiomavica.com/it/2012/04/07/php-some-best-practices/#comments</comments>
		<pubDate>Sat, 07 Apr 2012 13:18:30 +0000</pubDate>
		<dc:creator>alessioalx</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[best practices]]></category>

		<guid isPermaLink="false">http://www.alessiomavica.com/?p=220</guid>
		<description><![CDATA[PHP è uno dei linguaggi più utilizzati nella programmazione web. Questo da un lato si traduce in una comunità sempre più grande che ci da una mano, dall'altra in un numero sempre più grande di beginners che ignorano (nel senso che non conoscono) alcune best practices basilari. In parte è quello con cui mi sto [...]]]></description>
			<content:encoded><![CDATA[<p>PHP è uno dei linguaggi più utilizzati nella programmazione web. Questo da un lato si traduce in una comunità sempre più grande che ci da una mano, dall'altra in un numero sempre più grande di <em>beginners</em> che ignorano (nel senso che non conoscono) alcune <em>best practices</em> basilari. In parte è quello con cui mi sto scontrando in questo momento nella mia nuova esperienza professionale xD.</p>
<p>Ecco alcuni consigli utili per gli acquisti <img src='http://www.alessiomavica.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
<span id="more-220"></span></p>
<p><em><strong>1. Fare tante prove con php -a</strong></em></p>
<p>Quando programmiamo possiamo spesso avere dubbi su come scrivere un ciclo o quale sia il valore di ritorno di una funzione. Per questo possiamo utilizzare un potente strumento messo a disposizione dalla nostra installazione PHP. Se apriamo una console e scriviamo "<code>php -a</code>" ci troveremo davanti ad una shell interattiva per fare le nostre prove senza necessità di creare file ed eseguirli.</p>
<p><em><strong>2. empty vs. isset vs. is_null</strong></em></p>
<p>Molti programmatori non conoscono la differenza tra queste tre funzioni:</p>
<ul>
<li>empty</li>
<li>isset</li>
<li>is_null</li>
</ul>
<p>e le considerano intercambiabili tra di loro. Ovviamente questo non corrisponde alla verità. Ad esempio se consideriamo questo codice:</p>
<pre class="brush: php">
$var = 0;
var_dump(empty($var));
var_dump(isset($var));
</pre>
<p>notiamo che i due <em>var_dump</em> ci ritornano <em>true</em>. Questo significa che la variabile è instanziata ma è considerata vuota. Per approfondire il tema vi consiglio di leggere il manuale di PHP per le funzione <a href="http://php.net/manual/en/function.isset.php" title="Isset PHP" target="_blank">isset</a>, <a href="http://www.php.net/manual/en/function.empty.php" title="Empty PHP" target="_blank">empty</a> e <a href="http://it.php.net/manual/en/function.is-null.php" title="is_null PHP" target="_blank">is_null</a>, fare tante prove e dare un'occhiata a <a href="http://www.blueshoes.org/en/developer/php_cheat_sheet/" title="Empty() &#038; Co, Special Values" target="_blank">questa</a> comparativa.</p>
<p><em><strong>3. Operatore ternario</strong></em></p>
<p>Agli occhi di un <em>newbie</em> l'operatore ternario può sembrare ostico. In realtà la sua sintassi è semplice, concisa ed elegante. Ecco alcuni esempi di utilizzo comuni:</p>
<pre class="brush: php">
public function generic($param = null)
{
	(isset($param)) ? : $param = false;

	...

	return (isset($value)) $value : false;
}
</pre>
<p><em><strong>4. Suddividere la condizione di un if</strong></em></p>
<p>Se siamo davanti ad un <em>if</em> con una condizione particolarmente complessa può essere utile suddividerla in vari passi per migliorare la leggibilità del nostro codice.</p>
<pre class="brush: php">
// old version
if (isset($var) &amp;&amp;
	getSomething($var) == $value &amp;&amp;
	getAnotherThing($var) == $otherValue) {
	...
}

// new version
$cond = isset($var);
$cond = $cond &amp;&amp; (getSomething($var) == $value);
$cond = $cond &amp;&amp; getAnotherThing($var) == $otherValue;
if ($cond) {
	...
}
</pre>
<p><em><strong>5. Se possibile utilizzare l'operatore identico</strong></em></p>
<p>Se ci troviamo davanti ad un <em>if</em> in cui nella condizione conosciamo <em>a priori</em> il tipo dei due operandi è sempre meglio utilizzare l'operatore identico ("==="):</p>
<pre class="brush: php">
// old version
$x = true;
if ($x == true) {
	...
}

$x = (int) 0;
if ($x == 0) {
	...
}

// new version
$x = true;
if ($x === true) {
	...
}

$x = (int) 0;
if ($x === 0) {
	...
}
</pre>
<p>Questo serve per:</p>
<ul>
<li>migliorare la precisione della risposta</li>
<li>migliorare le performance (un 30%)</li>
</ul>
<p><em><strong>6. Condizione del <em>for</em> fuori della sua definizione</strong></em></p>
<p>Spostare la condizione di uscita del <em>for</em> fuori dalla sua definizione può migliorare del 50000% le sue performance per un array di 1000 elementi! Questo perchè per ogni iterazone si esegue un'altra volta il controllo e questo può essere pesante in termini di risorse utilizzate.</p>
<pre class="brush: php">
// old version
for ($i=0; $i &lt; count($x); $i++) {
	...
}

// new version
$limit = count($x);
for ($i=0; $i &lt; $limit; $i++) {
	...
}
</pre>
<p>Inoltre, se vogliamo limare ancora leggermente le performance, <em>sizeOf()</em> è leggermente più veloce della funzione <em>count()</em>.</p>
<p><em><strong>7. Print vs. echo vs. echo concatenato con virgole</strong></em></p>
<p>Ormai è raro vedere codice con un <em>print</em> ma meglio specificare che un <em>echo</em> è più rapido di un 30% e possiamo migliorare ulteriormente la velocità concatenando dentro del echo con una virgola invece che con il punto.</p>
<pre class="brush: php">
// peggiore
print &#039;Hello&#039; . &#039; &#039; . &#039;Alessio Mavica&#039;;

// migliore
echo &#039;Hello&#039; . &#039; &#039; . &#039;Alessio Mavica&#039;;

// ottimo
echo &#039;Hello&#039; , &#039; &#039; , &#039;Alessio Mavica&#039;;
</pre>
<p><em><strong>8. Leggenda metropolitana delle virgolette semplici vs. doppie virgolette</strong></em></p>
<p>Con le ultime versioni di PHP l'uso di risorse delle virgolette  semplici e delle doppie virgolette è praticamente uguale. </p>
<pre class="brush: php">
echo &#039;Hello Alessio Mavica&#039;;
</pre>
<p>È praticamente uguale a:</p>
<pre class="brush: php">
echo &quot;Hello Alessio Mavica&quot;;
</pre>
<p>Rimane la differenza che dentro delle doppie virgolette possiamo utilizzare variabili.</p>
<p><em><strong>9. Inizializzare le nostre variabili</strong></em></p>
<p>È una buona pratica inizializzare le nostre variabili prima di utilizzarle, soprattutto se ci troviamo in una situazione come questa:</p>
<pre class="brush: php">
if ($cond) {
	$var = array(&#039;Hello&#039;, &#039;Alessio&#039;, &#039;Mavica&#039;);
}

foreach ($var as $item) {
	echo $item . PHP_EOL;
}
</pre>
<p>Se <em>$cond</em> non è <em>true</em> questo <em>script</em> genererà un <em>notice</em> e un <em>warning</em>.</p>
<p>Ecco lo script corretto:</p>
<pre class="brush: php">
// variable initialization
$var = array();

if ($cond) {
	$var = array(&#039;Hello&#039;, &#039;Alessio&#039;, &#039;Mavica&#039;);
}

foreach ($var as $item) {
	echo $item . PHP_EOL;
}
</pre>
<p>Semplicemente inizializzando la nostra variabile ci troveremo senza errori e, soprattutto, con un codice più corretto, mantenibile e chiaro.</p>
<p><em><strong>10. PHP.net</strong></em></p>
<p><em>Last but not least</em>... consultiamo sempre la documentazione di PHP perché non è segno di ignoranza ma di voglia di migliorare le nostre abilità e conoscenze in PHP.</p>
<p><a href="http://php.net" title="PHP" target="_blank">PHP.NET</a> DOCET!</p>
<p><em><strong>CONCLUSIONI</strong></em></p>
<p>Programmare in PHP è semplice e comodo ma è necessario farlo bene per scrivere codice corretto, pulito e mantenibile. Se poi il nostro codice è anche elegante... abbiamo raggiunto il nostro obiettivo <img src='http://www.alessiomavica.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.alessiomavica.com/it/2012/04/07/php-some-best-practices/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>E_STRICT &#8211; 5 errori comuni</title>
		<link>http://www.alessiomavica.com/it/2012/02/14/e_strict-common-errors/</link>
		<comments>http://www.alessiomavica.com/it/2012/02/14/e_strict-common-errors/#comments</comments>
		<pubDate>Tue, 14 Feb 2012 22:37:15 +0000</pubDate>
		<dc:creator>alessioalx</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[e_strict]]></category>

		<guid isPermaLink="false">http://www.alessiomavica.com/?p=207</guid>
		<description><![CDATA[Quando sviluppiamo un'applicazione PHP è molto importante configurare correttamente l'error_reporting per analizzare gli errori messaggi della nostra applicazione. Dalla versione 5 si è incluso un nuovo livello denominato E_STRICT. Secondo la definizione di php.net: Enabling E_NOTICE during development has some benefits. For debugging purposes: NOTICE messages will warn you about possible bugs in your code. [...]]]></description>
			<content:encoded><![CDATA[<p>Quando sviluppiamo un'applicazione PHP è molto importante configurare correttamente l'error_reporting per analizzare gli <del datetime="2012-02-14T21:03:27+00:00">errori</del> messaggi della nostra applicazione. Dalla versione 5 si è incluso un nuovo livello denominato E_STRICT. Secondo la definizione di <a href="http://www.php.net/manual/en/errorfunc.configuration.php#ini.error-reporting" title="php.net" target="_blank">php.net</a>:</p>
<blockquote><p>Enabling E_NOTICE during development has some benefits. For debugging purposes: NOTICE messages will warn you about possible bugs in your code. For example, use of unassigned values is warned. It is extremely useful to find typos and to save time for debugging. NOTICE messages will warn you about bad style. For example, $arr[item] is better to be written as $arr['item'] since PHP tries to treat "item" as constant. If it is not a constant, PHP assumes it is a string index for the array.</p></blockquote>
<p>Con l'inclusione di E_STRICT nel E_ALL in PHP 5.4 no avremo scuse per non guardare questi messaggi.<br />
<span id="more-207"></span></p>
<p><em><strong>PERCHÉ UTILIZZARE E_STRICT?</strong></em></p>
<p>E_STRICT ci permette sviluppare codice più pulito e assicura una maggiore interoperabilità e compatibilità con versioni successive di PHP.</p>
<p><em><strong>I 5 ERRORI PIÙ COMUNI USANDO E_STRICT</strong></em></p>
<p>Di recente ho attivato l'E_STRICT in una web per aggiornare il codice e questi sono i 5 errori più frequenti con cui mi sono trovato faccia a faccia:</p>
<p><u>1. Funzioni obsolete</u></p>
<p>PHP ci indica se una funziona è deprecata. Ecco qui la lista delle obsolete per la versione 5.3: http://php.net/manual/en/migration53.deprecated.php</p>
<p>Errore:</p>
<blockquote><p>PHP Deprecated:  Function xxx() is deprecated</p></blockquote>
<p><u>2. Static</u></p>
<p>Molte volte dimentichiamo di porre la keyword "static" nella definizione di una funzione che poi utilizziamo con class::method</p>
<p>Errore: </p>
<blockquote><p>Non-static method XXX should not be called statically, assuming $this from incompatible context</p></blockquote>
<p><u>3. Overloading</u></p>
<p>In PHP non esiste l'overloading, lo possiamo solo "simulare" con __call pero come tutti i metodi magici è abbastanza costoso. In altre parole non possiamo dichiarare due funzioni con lo stesso nome che si differenziano solo per la firma (parametri). Dunque nel caso dell'overriding (sovrascrittura di un metodo di una classe padre che abbiamo ereditato) dobbiamo utilizzare gli stessi parametri o, al massimo, aggiungerne altri.</p>
<p>Errore:</p>
<blockquote><p>Declaration of XXX should be compatible with that of YYY</p></blockquote>
<p><u>4. Passare una variabile a una funzione che accetta un parametro per referenzia</u></p>
<p>Non è possibile non passare una variabile a una funzione che accetta un parametro per referenzia. Concretamente non possiamo fare questo:</p>
<p><code>array_pop(explode('-', 'hello-world'));</code></p>
<p>Dobbiamo salvare il risultato dell'explode in una variabile e successivamente passarla all'array_pop:</p>
<p><code>$hola = explode('-', 'hello-world');<br />
array_pop($var);</code></p>
<p>Ecco alcune funzioni che accettano parametri per referenzia: array_shift, array_unshift, array_pop, array_push, current, end...</p>
<p>Errore: </p>
<blockquote><p>Only variables should be passed by reference</p></blockquote>
<p><u>5. Creare un oggetto generico</u></p>
<p>A volte per passare dati via json o per comodità creiamo un oggetto generico senza inizializzarlo. Per esempio:</p>
<p><code>$obj->propierty = true;</code></p>
<p>In questo caso dobbiamo inizializzare l'oggetto in questo modo:</p>
<p><code>$obj = new stdClass();<br />
$obj->propierty = true;</code></p>
<p>Errore: </p>
<blockquote><p>Creating default object from empty value</p></blockquote>
<p><em><strong>CONCLUSIONI</strong></em></p>
<p>L'uso di E_STRICT ci permetterà di sviluppare applicazioni compatibili con il futuro e ci aiuta a apprendere dettagli del PHP che non conoscevamo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alessiomavica.com/it/2012/02/14/e_strict-common-errors/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Design patterns &#8211; Lista dei più usati e quando utilizzarli</title>
		<link>http://www.alessiomavica.com/it/2011/10/26/design-pattern/</link>
		<comments>http://www.alessiomavica.com/it/2011/10/26/design-pattern/#comments</comments>
		<pubDate>Wed, 26 Oct 2011 14:48:35 +0000</pubDate>
		<dc:creator>alessioalx</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[refactoring]]></category>

		<guid isPermaLink="false">http://www.alessiomavica.com/?p=192</guid>
		<description><![CDATA[Possiamo definire i design pattern come soluzioni tecniche collaudate a problemi ricorrenti della programmazione. Quali sono i più famosi e quali sono questi problemi ricorrenti? In questo articolo proporrò una lista dei più famosi design pattern associati al problema che risolvono così da trovarli rapidamente. PRO E CONTRO DELL'UTILIZZO DI DESIGN PATTERN Anzitutto si deve [...]]]></description>
			<content:encoded><![CDATA[<p>Possiamo definire i <strong>design pattern</strong> come soluzioni tecniche collaudate a problemi ricorrenti della programmazione.</p>
<p>Quali sono i più famosi e quali sono questi problemi ricorrenti? In questo articolo proporrò una lista dei più famosi design pattern associati al problema che risolvono così da trovarli rapidamente.<br />
<span id="more-192"></span><br />
<em><strong>PRO E CONTRO DELL'UTILIZZO DI DESIGN PATTERN</strong></em></p>
<p>Anzitutto si deve sottolineare che l'utilizzo di design pattern ha lati positivi e negativi. Riassumiamo pro e contro:</p>
<p><em>PRO:</em></p>
<ul>
<li>soluzioni collaudate</li>
<li>architettura più semplice da decodificare (reverse engineering)</li>
</ul>
<p><em>CONTRO:</em></p>
<ul>
<li>non sempre rappresentano la soluzione più ottimizzata</li>
<li>capire quando è possibile utilizzarli (necessitano un minimo d'esperienza)</li>
</ul>
<p><em><strong>I DESIGN PATTERN PIÙ NOTI E CHE PROBLEMA RISOLVONO</strong></em></p>
<p><u>Adapter</u></p>
<p>Adattare un nuovo oggetto a un sistema di classi già esistenti e stabili.</p>
<p><u>Builder</u></p>
<p>Delegare la costruzione di un oggetto a un'altra classe. Necessario soprattutto per oggetti complessi la cui costruzione dipende da vari fattori.</p>
<p><u>Decorator</u></p>
<p>Aggiungere o modificare funzionalità di un oggetto senza modificare la sua struttura interna.</p>
<p><u>Delegate</u></p>
<p>Modificare un oggetto estraendo una parte di codice complesso ma indipendente per creare una nuova classe. Consigliato nel caso di if o switch complessi.</p>
<p><u>Façade</u></p>
<p>Creare un nuovo livello (classe) per nascondere la complessità di un oggetto.</p>
<p><u>Factory</u></p>
<p>Creare un'interfaccia che crea un'istanza di un oggetto senza specificare <em>a priori </em>la classe.</p>
<p><u>Interpreter</u></p>
<p>Analizza gli elementi chiave di una entità e ne fornisce una interpretazione (per esempio per creare un sistema di template).</p>
<p><u>Iterator</u></p>
<p>Aiuta a costruire oggetti i cui elementi possono essere manipolati in maniera simile ad un array.</p>
<p><u>Mediator</u></p>
<p>Si utilizza quando dobbiamo modificare più oggetti simili. La classe mediator si occupa di modificarle tutte.</p>
<p><u>Observer</u></p>
<p>Serve a creare oggetti che osservano altri oggetti per fornire notizie sullo stato di quest'ultimi.</p>
<p><u>Prototype</u></p>
<p>Serve a creare un oggetto che clona un altro per risparmiare risorse (per esempio per oggetti con costruttori molto pesanti e, in parte, inutili).</p>
<p><u>Proxy</u></p>
<p>Crea un oggetto che si interpone in maniera trasparente tra altri due per controllare l'accesso o sovrascrivere funzionalità.</p>
<p><u>Singleton</u></p>
<p>Serve a creare un'unica istanza di un oggetto (per esempio per l'accesso a una DDBB).</p>
<p><u>Strategy</u></p>
<p>Si utilizza se isoliamo un algoritmo in un oggetto che sappiamo possa variare dinamicamente e ne creiamo diverse classi.</p>
<p><u>Template</u></p>
<p>Semplicemente creare una classe astratta che fornisca una serie di metodi che utilizzeranno le classi che la ereditano.</p>
<p><u>Visitor</u></p>
<p>Per minimizzare le modifiche a una classe (<a href="http://en.wikipedia.org/wiki/Open/closed_principle" title="Open-closed principle" target="_blank">principio open/close</a>) si crea un'altra che viene chiamata ogniqualvolta si istanzi la prima. E' come se "estendessimo" la classe virtualmente.</p>
<p><em><strong>CONCLUSIONI</strong></em></p>
<p>I design pattern sono molto potenti e utili. Ogni buon programmatore dovrebbe conoscerli e utilizzarli al meglio. Spero che questa mini-guida vi aiuti a riconoscere quando è possibile utilizzarne uno per seguire il principio del "non reinventare la ruota".</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alessiomavica.com/it/2011/10/26/design-pattern/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP refactoring</title>
		<link>http://www.alessiomavica.com/it/2011/09/17/php-refactoring/</link>
		<comments>http://www.alessiomavica.com/it/2011/09/17/php-refactoring/#comments</comments>
		<pubDate>Sat, 17 Sep 2011 18:22:43 +0000</pubDate>
		<dc:creator>alessioalx</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Optimization]]></category>
		<category><![CDATA[refactoring]]></category>

		<guid isPermaLink="false">http://www.alessiomavica.com/?p=169</guid>
		<description><![CDATA[Ogni applicazione in continua crescita necessita modifiche per renderla più rapida, per riorganizzala o per prepararci a nuovi sviluppi a medio o lungo termine. Questo processo prende il nome di Refactoring, parola che molti odiano in quanto prevede l'impiego di risorse per qualcosa che non è un prodotto completo o una release. È naturale, dunque, [...]]]></description>
			<content:encoded><![CDATA[<p>Ogni applicazione in continua crescita necessita modifiche per renderla più rapida, per riorganizzala o per prepararci a nuovi sviluppi a medio o lungo termine.</p>
<p>Questo processo prende il nome di <strong>Refactoring</strong>, parola che molti odiano in quanto prevede l'impiego di risorse per qualcosa che non è un prodotto completo o una <em>release</em>. È naturale, dunque, che il vostro <em>Product Owner</em> non lo veda di buon'occhio. Sebbene in lotta continua per il <a href="http://en.wikipedia.org/wiki/Time_to_market" title="Alessio Mavica - Time To Market" target="_blank">Time To Market</a> gli sviluppatori dovrebbero prestare la dovuta attenzione a questa fase giacché si potrebbe arrivare alla classica situazione di stallo in cui modificare il <a href="http://en.wikipedia.org/wiki/Spaghetti_code" title="Alessio Mavica - Spaghetti code" target="_blank">codice spaghetti</a> a cui si è arrivati presuppone un costo maggiore del refactoring stesso.</p>
<p>Dunque quali sono le linee guida per un buon Refactoring? Cerchiamole insieme...</p>
<p><span id="more-169"></span><br />
<em><strong>QUAL'È LA DEFINIZIONE DI REFACTORING</strong></em></p>
<p>Ufficialmente possiamo definire il refactoring come il processo per alterare il funzionamento interno di un'applicazione senza modificare il suo comportamento esterno.</p>
<p><em><strong>GLI OBBIETTIVI</strong></em></p>
<ul>
<li>Minore complessità</li>
<li>Maggiore leggibilità</li>
<li>Migliorare la fase di manutenzione</li>
<li>Migliorare la scalabilità</li>
</ul>
<p>Ecco dunque un decalogo per portare a termine in maniera soddisfacente il lavoro di refactoring:</p>
<ol>
<li><a href="#new_methods">CREARE NUOVI METODI</a></li>
<li><a href="#new_variables">INTRODURRE NUOVE VARIABILI ESPLICATIVE</a></li>
<li><a href="#rename_methods">RINOMINARE METODI</a></li>
<li><a href="#move_items">MUOVERE ELEMENTI</a></li>
<li><a href="#new_classes">CREARE NUOVE CLASSI</a></li>
<li><a href="#hide_delegates">NASCONDERE DELEGATI</a></li>
<li><a href="#array_to_object">TRASFORMARE ARRAY IN OGGETTI</a></li>
<li><a href="#inheritance_to_delegate">CAMBIARE EREDITÁ PER DELEGATI</a></li>
<li><a href="#last_three_rules">ULTIME TRE REGOLE</a></li>
</ol>
<p><em><strong><a name="new_methods" style="color: black;">1. CREARE NUOVI METODI</a></strong></em></p>
<p>Supponiamo di avere questa funzione che calcola il prezzo totale di un articolo comprese tasse e spese di spedizione:</p>
<pre class="brush: php">
public function getTotalPrice($id_product)
{
	$product_price = $this-&gt;getProductPrice($id_product);
	$product_price_taxed = $this-&gt;tax * $product_price;
	$product_price_shipping = $this-&gt;getProductShipping($id_product);

	$product_price_total =
		$product_price_taxed + $product_price_shipping;

	return $product_price_total;
}
</pre>
<p>Possiamo isolare la linea per il calcolo delle imposte in un nuovo metodo.</p>
<pre class="brush: php">
// line 4 modified
$product_price_taxed = $this-&gt;getPriceTaxed($product_price);
</pre>
<pre class="brush: php">
// new method
public function getPriceTaxed($product_price)
{
	return $this-&gt;tax * $product_price;
}
</pre>
<p><em><strong><a name="new_variables" style="color: black;">2. INTRODURRE NUOVE VARIABILI ESPLICATIVE</a></strong></em></p>
<p>Soprattutto nei casi di cicli con condizioni particolarmente complesse è consigliabile creare nuove variabili esplicative.</p>
<pre class="brush: php">
if (strpos($_SERVER[&#039;SERVER_NAME&#039;], &#039;local&#039;) === FALSE)
	// do something
</pre>
<p>Ed ecco qui la versione con una nuova variabile esplicativa:</p>
<pre class="brush: php">
$is_local = strpos($_SERVER[&#039;SERVER_NAME&#039;], &#039;local&#039;);

if ($is_local === FALSE)
	// do something
</pre>
<p><em><strong><a name="rename_methods" style="color: black;">3. RINOMINARE METODI</a></strong></em></p>
<p>Odio profondamente quegli sviluppatori che creano metodi con nomi assolutamente inutili perché generici: <em>get</em>, <em>set</em>, <em>getForm</em>, <em>setValue</em>...</p>
<p>I nomi dei metodi, come i titoli dei giornali, devono essere scelti in modo opportuno: esplicativi ma non troppo lunghi.</p>
<p><em><strong><a name="move_items" style="color: black;">4. MUOVERE ELEMENTI</a></strong></em></p>
<p>Un altro passo per un buon refactoring è trovare la giusta posizione per metodi e attributi. Supponiamo, ad esempio, di aver creato la classe <em>car</em> con la variabile <em>piston</em> e che successivamente abbiamo creato la classe <em>motor</em>. È chiaro che la variabile <em>piston</em> sia un attributo della classe <em>motor</em> e non della classe <em>car</em>. È dunque nella fase di refactoring che dovremmo riorganizzare le giuste associazioni tra classi, attributi e metodi.</p>
<p><em><strong><a name="new_classes" style="color: black;">5. CREARE NUOVE CLASSI</a></strong></em></p>
<p>Se abbiamo un costrutto <em>if</em> (o <em>switch</em>) del tipo:</p>
<pre class="brush: php">
public class car
{
	private $motor;

	public function __constructor($motor)
	{
		$this-&gt;motor = $motor;
	}

	public function getMotor()
	{
		if($this-&gt;motor == &#039;DIESEL&#039;)
			return $this-&gt;getDieselPrice();
		elseif($this-&gt;motor == &#039;UNLEADED&#039;)
			return $this-&gt;getUnleadedPrice();
	}
}
</pre>
<p>Allora è molto probabile che dobbiamo creare tre nuove classi:</p>
<ul>
<li>una astratta <em>motor</em></li>
<li>una dieselMotor che estende <em>motor</em></li>
<li>una unleadedMotor che anch'essa estende <em>motor</em></li>
</ul>
<p><em><strong><a name="hide_delegates" style="color: black;">6. NASCONDERE DELAGATI</a></strong></em></p>
<p>Se abbiamo una linea di codice del tipo:</p>
<pre class="brush: php">
$fuelType = $car-&gt;getMotor()-&gt;getFuelType();
</pre>
<p>In cui il metodo <em>getMotor</em> è il seguente:</p>
<pre class="brush: php">
public function getMotor()
{
	return $this-&gt;motor;
}
</pre>
<p>Dobbiamo modificarlo in modo tale da ritornare direttamente l'attributo di cui abbiamo bisogno:</p>
<pre class="brush: php">
public function getMotor()
{
	return $this-&gt;motor-&gt;getFuelType();
}
</pre>
<p>Tutto questo per seguire la <a href="http://en.wikipedia.org/wiki/Law_of_Demeter" title="Alessio Mavica - Law of Demeter" target="_blank">Legge di Demetra</a> secondo la quale non dobbiamo affidarci alla struttura interna di un altro oggetto perché, in caso di modifiche, dovremmo modificare più parti di codice.</p>
<p><em><strong><a name="array_to_object" style="color: black;">7. TRASFORMARE ARRAY IN OGGETTI</a></strong></em></p>
<p>Supponiamo di avere una classe <em>car</em> siffatta:</p>
<pre class="brush: php">
public class car
{
	private $details;

	public function __constructor($details)
	{
		$this-&gt;details = $details;
	}
}
</pre>
<p>Dunque per creare l'oggetto <em>car</em> dobbiamo passare come parametro un <em>array</em> con le caratteristiche dell'auto. Se vogliamo ora ritornare un dettaglio dell'auto dobbiamo leggerlo dall'array <em>$details</em>.<br />
La maniera più corretta per inizializzare un oggetto e immagazzinare i suoi attributi è creare una variabile per ogni caratteristica come nell'esempio seguente:</p>
<pre class="brush: php">
public class car
{
	private $motor;
	private $brand;
	private $model;

	public function __constructor($motor, $brand, $model)
	{
		$this-&gt;motor = $motor;
		$this-&gt;brand = $brand;
		$this-&gt;model = $model;
	}
}
</pre>
<p><em><strong><a name="inheritance_to_delegate" style="color: black;">8. CAMBIARE UNA EREDITÀ CON DELEGATI</a></strong></em></p>
<p>Supponiamo di avere una classe che implementa un'<em>interfaccia</em> per effettuare il <em>log</em> dell'applicazione:</p>
<pre class="brush: php">
public class car extends Logger
{
	public function run()
	{
		...
		$this-&gt;log(...);
	}
}
</pre>
<p>Il modo più corretto per fare tutto ciò è passare l'oggetto <em>logger</em> come parametro nel momento di creare l'oggetto <em>car</em> e accedere quindi alla variabile senza estendere nessuna classe. Anche in questo caso seguiamo la legge di Demetra.</p>
<pre class="brush: php">
public class car
{
	private $logger;

	public function __contruct($logger)
	{
		$this-&gt;logger = $logger;
	}
	public function run()
	{
		...
		$this-&gt;logger-&gt;log(...);
	}
}
</pre>
<p><em><strong><a name="last_three_rules" style="color: black;">9. ULTIME TRE REGOLE</a></strong></em></p>
<p>Gli ultimi tre consigli per un buon refactoring sono:</p>
<ol>
<li>eliminare codice ridondante</li>
<li>scrivere blocchi di codice brevi</li>
<li>separare concetti diversi</li>
</ol>
<p><strong><em>CONCLUSIONI</em></strong></p>
<p>Il lavoro di refactoring deve essere incluso in ogni buon progetto ed è fondamentale per rendere l'applicazione semplice e mantenibile e quindi evitare di arrivare ad avere un codice spaghetti che è impossibile da sbrogliare.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alessiomavica.com/it/2011/09/17/php-refactoring/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Interface vs. Abstract class in PHP</title>
		<link>http://www.alessiomavica.com/it/2011/09/12/interface-abstract-class-php-castellano/</link>
		<comments>http://www.alessiomavica.com/it/2011/09/12/interface-abstract-class-php-castellano/#comments</comments>
		<pubDate>Mon, 12 Sep 2011 17:51:15 +0000</pubDate>
		<dc:creator>alessioalx</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[abstract class]]></category>
		<category><![CDATA[interface]]></category>

		<guid isPermaLink="false">http://www.alessiomavica.com/?p=138</guid>
		<description><![CDATA[Interface e Abrastract class sono concetti della OOP poco utilizzati in PHP. I motivi sono principalmente due: requisiti poco chiari (o idee poco chiare da parte dello sviluppatore) in fase di progettazione poca conoscenza di questi concetti Vediamo dunque di fare un po' di chiarezza. COS'È UN'INTERFACCIA La definizione più chiara è che un'interfaccia è [...]]]></description>
			<content:encoded><![CDATA[<p>Interface e Abrastract class sono concetti della <a href="http://en.wikipedia.org/wiki/Object-oriented_programming" title="Alessio Mavica - Object oriented programming" target="_blank">OOP</a> poco utilizzati in PHP. I motivi sono principalmente due:</p>
<ul>
<li>requisiti poco chiari (o idee poco chiare da parte dello sviluppatore) in fase di progettazione</li>
<li>poca conoscenza di questi concetti</li>
</ul>
<p>Vediamo dunque di fare un po' di chiarezza.<br />
<span id="more-138"></span><br />
<em><strong>COS'È UN'INTERFACCIA</strong></em></p>
<p>La definizione più chiara è che un'interfaccia è un <em>contratto</em>.</p>
<p>Caratteristiche:</p>
<ul>
<li>tutte le classi che <em>implementano</em> un'interfaccia devono sviluppare tutti i metodi che sono stati definiti</li>
<li>per ogni metodo si definisce solo la firma</li>
<li>i metodi possono essere solo pubblici</li>
<li>una classe può implementare più di un'interfaccia</li>
<li>un'interfaccia può essere utilizzata per il <a href="http://php.net/manual/en/language.oop5.typehinting.php" title="Alessio Mavica - Type Hinting" target="_blank">Type Hinting</a></li>
</ul>
<pre class="brush: php">
interface logsInterface
{
  public function log($message, $priority = null);
}
</pre>
<p><em><strong>COS'È UNA CLASSE ASTRATTA</strong></em></p>
<p>E' una classe "padre" che deve essere ereditata per poter essere utilizzata. Le classi che la ereditano differiscono tra di loro solo nei metodi astratti e possono accedere ai metodi della classe padre mediante la keyword <em>parent</em>.</p>
<p>Caratteristiche:</p>
<ul>
<li>non può essere instanziata</li>
<li>i metodi possono essere astratti (non implementati)</li>
<li>i metodi possono non essere astratti (implementati)</li>
<li>una classe può ereditare solo una classe astratta</li>
</ul>
<pre class="brush: php">
abstract class logsAbstract
{
    private $variable;
    abstract public function logMethod();

    public function getVariable()
    {
        return $this-&gt;variable;
    }
}
</pre>
<p><em><strong>TABELLA RIEPILOGATIVA INTERFACE VS ABSTRACT CLASS</strong></em></p>
<table>
<tr>
<td style="width:50%"><strong>Abstract Class</strong></td>
<td style="width:50%"><strong>Interface</strong></td>
</tr>
<tr>
<td>Un metodo che non viene implementato deve essere definito come <em>abstract</em></td>
<td>Non è possibile implementare metodi, solo definire le firme</td>
</tr>
<tr>
<td>Un metodo abstract può essere definito <em>public</em>, <em>protected</em> o <em>private</em>. Le sottoclassi che ereditano dalla classe padre devono implementare questi metodi con la stessa visibilità o, al più, minore</td>
<td>Tutti i metodi sono public</td>
</tr>
<tr>
<td>Può contenere variabili e costanti</td>
<td>Può contenere solo costanti</td>
</tr>
<tr>
<td>Una classe può ereditare solo una classe padre</td>
<td>Una classe può implementare più di una interfaccia</td>
<tr>
<td>Una classe figlia può o no sovrascrivere (override) un metodo definito nella classe padre</td>
<td>Una classe che implementa un'interfaccia deve sovrascrivere tutti i metodi dell'interfaccia</td>
</tr>
</table>
<p>In generale se una classe astratta contiene solo metodi astratti la stiamo utilizzando come un'interfaccia.</p>
<p><em><strong>CONCLUSIONI</strong></em></p>
<p>Le classi astratte si utilizzano per condividere funzioni.<br />
Le interfacce si utilizzano per condividere come va fatto qualcosa.</p>
<p><em><strong>LINKS</strong></em></p>
<ul>
<li><a href="http://test.ical.ly/2010/05/12/why-are-interfaces-widely-ignored-in-the-php-world-and-what-use-do-they-have-when-working-with-symfony/" title="Alessio Mavica - Interface in Symfony" target="_blank">Why are interfaces widely ignored in the PHP world and what use do they have when working with symfony?</a></li>
<li><a href="http://drenganathan.wordpress.com/2009/02/06/difference-between-abstract-class-and-interface-in-php/" title="Alessio Mavica - Difference between class and interface" target="_blank">Difference between abstract classes and interfaces</a></li>
<li><a href="http://www.developer.com/lang/php/article.php/10941_3604111_2/PHP-5-OOP-Interfaces-Abstract-Classes-and-the-Adapter-Pattern.htm" title="Alessio Mavica - PHP 5 OOP: Interfaces Abstract Classes and the Adapter Pattern" target="_blank">Esempio di interface e abstract class</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.alessiomavica.com/it/2011/09/12/interface-abstract-class-php-castellano/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Namespaces in PHP 5.3</title>
		<link>http://www.alessiomavica.com/it/2011/09/09/namespaces-php-castellano/</link>
		<comments>http://www.alessiomavica.com/it/2011/09/09/namespaces-php-castellano/#comments</comments>
		<pubDate>Fri, 09 Sep 2011 11:08:47 +0000</pubDate>
		<dc:creator>alessioalx</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[namespace]]></category>

		<guid isPermaLink="false">http://www.alessiomavica.com/?p=82</guid>
		<description><![CDATA[Fino a qualche settimana fa non conoscevo che fosse possibile in PHP (>=5.3) fare qualcosa di simile a quello che si fa in Java con i packages. Il problema che ci si presenta è quello dei name collitions, cioè della confusione che si puó produrre parlando di due cose diverse che hanno lo stesso nome. [...]]]></description>
			<content:encoded><![CDATA[<p>Fino a qualche settimana fa non conoscevo che fosse possibile in PHP (>=5.3) fare qualcosa di simile a quello che si fa in Java con i <em>packages</em>.</p>
<p>Il problema che ci si presenta è quello dei <em>name collitions</em>, cioè della confusione che si puó produrre parlando di due cose diverse che hanno lo stesso nome. Nel caso del PHP si potrebbero produrre sovrascrivendo nomi di classi, funzioni o costanti.</p>
<p>La soluzione nel PHP è tanto semplice quanto geniale e si chiama <strong><em>namespaces</em></strong>. Inoltre se si utilizza nella nuova versione del Zend Framework (2.0) sarà qualcosa di buono <img title="Lengua" src="http://www.alessiomavica.com/wp-content/uploads/2011/09/xP_emoticon.png" alt="" width="19" height="19" /><br />
<span id="more-82"></span><br />
Ufficialmente i namespaces servono per incapsulare. Questo significa che possiamo creare pacchetti di classi sicuri che non produrremo name collitions. Un esempio vale più di mille parole:</p>
<p><em><strong>ESEMPIO:</strong></em></p>
<pre class="brush: php">
/*FILE file1.php*/
namespace namespace1;
class testClass {
        function whoAmI (){
                return &#039;file1&#039; . PHP_EOL;
        }
}

/*FILE file2.php*/
namespace namespace2;
class testClass {
        function whoAmI() {
                return &#039;file2&#039; . PHP_EOL;
        }
}

/*FILE test.php*/
require_once(&#039;./file1.php&#039;);
require_once(&#039;./file2.php&#039;);

$class1 = new \namespace1\testClass();
echo $class1-&gt;whoAmI();

$class2 = new \namespace2\testClass();
echo $class2-&gt;whoAmI();

/*********
Output:
file1
file2
*********/
</pre>
<p>Come possiamo vedere abbiamo utilizzato due classi con lo stesso nome senza generare collisioni. Lo stesso vale utilizzando costanti e funzioni.</p>
<p><em><strong>VANTAGGI:</strong></em></p>
<p>Dunque, quali sono i vantaggi?</p>
<p>1. codice più chiaro<br />
2. migliore organizzazione se stiamo sviluppando un'applicazione molto grande<br />
3. iniziare a utilizzare un nuovo elemento che sarà il nostro pane quotidiano nei prossimi anni</p>
<p><em><strong>SUB-NAMESPACES:</strong></em></p>
<p>A differenza dei packages di Java nel PHP possiamo creare diversi livelli di namespace affinché il nostro codice risulti più organizzato.</p>
<pre class="brush: php">
\namespace1\subnamespace\subsubnamespace
</pre>
<p><em><strong>UTILIZZARE UN NAMESPACE (use):</strong></em></p>
<p>Negli esempi anteriori abbiamo utilizzando un backslash all'inizio del namespace. Questo significa che il namespace che utilizzeremo è di tipo GLOBALE. In altre parole i path che utilizzeremo si riferiscono alla root del nostro "albero" di namespaces. Una maniera più semplice di utilizzare i nostri namespaces è definire un "livello" che utilizzeremo attraverso la parola riservata <em>use</em>.</p>
<p>Ipotizziamo di avere la classe <em>class1</em> nel seguente namespace:</p>
<pre class="brush: php">
\namespace1\subnamespace\subsubnamespace
</pre>
<p>Per poterla instanziare dovremmo utilizare questo codice:</p>
<pre class="brush: php">
$class = new \namespace1\subnamespace\subsubnamespace\class1();
</pre>
<p>Lavorando con il <em>use</em> possiamo semplicemente scrivere:</p>
<pre class="brush: php">
use \namespace1\subnamespace\subsubnamespace;
$class = new subsubnamespace\class1();
</pre>
<p><em><strong>ALIAS:</strong></em></p>
<p>L'alias è un costrutto molto utile per rendere il nostro codice più semplice e facile da mantenere. Supponiamo che nell'esempio anteriore il nome del namespace <em>subsubnamespace</em> non ci piaccia o che sia troppo lungo, possiamo utilizzare la seguente sintassi:</p>
<pre class="brush: php">
use \namespace1\subnamespace\subsubnamespace as newname;
$class = new newname\class1();
</pre>
<p><em><strong>VARIABILE __NAMESPACE__:</strong></em></p>
<p>Per sapere in che namespace ci troviamo attualmente possiamo utilizzare la variabile __NAMESPACE__</p>
<p><em><strong>CONCLUSIONI:</strong></em></p>
<p>Questo post non vuole essere una trattato completo sui namespaces ma mostrare una panoramica delle sue capacità.</p>
<p>Vi lascio 3 links molto interessanti su questo tema:</p>
<ul>
<li><a href="http://php.net/manual/en/language.namespaces.php" title="Alessio Mavica - Manuale PHP namespaces" target="_blank">Manual PHP</a></li>
<li><a href="http://www.sitepoint.com/php-53-namespaces-basics/" title="Alessio Mavica - Sitepoint" target="_blank">Post di un altro blog in inglese</a></li>
<li><a href="http://www.baluart.net/articulo/los-namespaces-de-php-53-una-buena-forma-de-tener-un-codigo-mas-limpio-y-organizado" title="Alessio Mavica - Baluart" target="_blank">Un altro blog che tratta il tema in maniera molto esaustiva ma in spagnolo</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.alessiomavica.com/it/2011/09/09/namespaces-php-castellano/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP Output Buffering Control</title>
		<link>http://www.alessiomavica.com/it/2011/08/24/php-output-buffering-control/</link>
		<comments>http://www.alessiomavica.com/it/2011/08/24/php-output-buffering-control/#comments</comments>
		<pubDate>Wed, 24 Aug 2011 14:00:35 +0000</pubDate>
		<dc:creator>alessioalx</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Optimization]]></category>

		<guid isPermaLink="false">http://www.alessiomavica.com/?p=11</guid>
		<description><![CDATA[Quando dopo una richiesta il server invia l'html al client no lo ritorna in un'unica volta ma a spezzoni. Possiamo fare qualcosa per controllarlo? La risposta sta nell'Output Buffering Control di PHP. La idea è semplice: Conservare l'output in una variabile e ritornarla in un'unica volta. VANTAGGI: I vantaggi di utilizzare l'Output Buffering Control sono [...]]]></description>
			<content:encoded><![CDATA[<p>Quando dopo una richiesta il server invia l'html al client no lo ritorna in un'unica volta ma a spezzoni.<br />
Possiamo fare qualcosa per controllarlo? La risposta sta nell'Output Buffering Control di <a href="http://php.net/manual/es/book.outcontrol.php" title="PHP Output Buffering Controller" target="_blank">PHP</a>.</p>
<p>La idea è semplice:<br />
Conservare l'output in una variabile e ritornarla in un'unica volta.<br />
<span id="more-11"></span><br />
<em><strong>VANTAGGI</strong></em>:</p>
<p>I vantaggi di utilizzare l'Output Buffering Control sono molteplici:</p>
<ul>
<li>Maggiore velocità</li>
<li>Minor utilizzo di banda</li>
<li>Maggior controllo</li>
<li>Possibilità di ridirezionare l'output a un file</li>
<li>Manipolare l'output</li>
<li>Configurare header e cookie in qualsiasi punto del codice</li>
</ul>
<p><strong><em>FUNZIONI</em></strong>:</p>
<p>La funzione per iniziare a utilizzare  Output Buffering Control è ob_start. Possiamo passare un parametro per definire la funzione callback.<br />
La più utilizzata è <a href="http://www.php.net/manual/es/function.ob-gzhandler.php" title="ob_gzhandler" target="_blank">ob_gzhandler</a> che consente la compressione del nostro output mediante l'algoritmo gzip.</p>
<p>Possiamo eliminare l'output buffering con due funzioni:</p>
<ul>
<li>ob_end_clean: libera l'output buffering</li>
<li>ob_end_flush: invia l'output buffering al client e termina l'esecuzione</li>
</ul>
<p>Altre funzioni utili sono:</p>
<ul>
<li>ob_clean: libera il buffer</li>
<li>ob_get_clean: ritorna il buffer per salvarlo in una variabile e lo libera</li>
<li>ob_get_flush: ritorna il buffer al client e lo libera</li>
<li>ob_get_length: ritorna la lunghezza attuale del buffer</li>
<li>ob_get_level: ritorna il libello di annidamento del meccanismo di buffer (si possono annidare più buffer)</li>
<li>ob_get_status: ritorna lo stato del buffer attuale (o di tutti se passiamo il parametro TRUE)</li>
<li>ob_implicit_flush: di default se non chiamiamo la funzione ob_end_flush si esegue automaticamente alla fine dello script</li>
<li>output_add_rewrite_var: aggiunge una variabile (nome=valore) in ogni URL che non sia assoluta e un campo hidden in ogni form</li>
<li>output_reset_rewrite_vars: ristabilisce i valori de default del meccanismo di riscrittura delle URL</li>
<p><em><strong>ESEMPI</strong></em>:</p>
<pre class="brush: php">
&lt;php
ob_start();
echo &quot;Hello World!&quot;;
ob_end_flush();
?&gt;
</pre>
<p>Per realizzare la compressione dell'output dobbiamo passare il parametro <em>ob_gzhandler</em> alla funzione ob_start:</p>
<pre class="brush: php">
&lt;?php
ob_start(&#039;ob_gzhandler&#039;);
echo &quot;Hello World!&quot;;
ob_end_flush();
?&gt;
</pre>
<p><em><strong>TIPS</strong></em>:<br />
Possiamo chiamare una funzione callback che pulisca tutto l'output prima di inviarlo al client.<br />
Ecco alcune più frequenti:<br />
- rimuovere spazi bianchi ripetuti:</p>
<pre class="brush: php">trim(preg_replace(&#039;/\s+/&#039;, &#039; &#039;, $buffer));</pre>
<p>- codificare HTML entities. Per esempio:</p>
<pre class="brush: php">$buffer = str_replace(&#039;&amp;&#039;, &#039; &amp;;amp;&#039;, $buffer);</pre>
<p>- ridirigere l'output a un file</p>
<p><em><strong>PERFORMANCE</strong></strong></em>:<br />
Utilizzando questo semplice script ho registrato un miglioramento del 10% nella velocità ed il peso della pagina è passato da 244.2KB a 612B.</p>
<pre class="brush: php">
&lt;?php
ob_start(&#039;ob_gzhandler&#039;);
for ($j=1; $j &lt;= 5; $j++)
{
list($usec, $sec) = explode(&quot; &quot;,microtime());
$debut[$j] = ((float)$usec + (float)$sec);

echo str_repeat(&quot;0123456789&quot;,5000) . &#039;&lt;br&gt;&#039; ;

list($usec, $sec) = explode(&quot; &quot;,microtime());
$fin[$j] = ((float)$usec + (float)$sec);
}
echo &#039;&lt;br&gt;&lt;br&gt;TEST PERFORMANCE&lt;/br&gt;&lt;br&gt;&#039;;

$total = 0;
for ($j=1; $j &lt;= 5; $j++)
$total += round($fin[$j]-$debut[$j], 5) . &#039;&lt;br&gt;&#039;;

echo &#039;TOTAL: &#039;. $total;

ob_end_flush();
?&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.alessiomavica.com/it/2011/08/24/php-output-buffering-control/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

