<?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>Ciarpame {.com} &#187; classes</title>
	<atom:link href="http://www.ciarpame.com/tag/classes/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ciarpame.com</link>
	<description>Useful stuffs for the masses. Useless things for few.</description>
	<lastBuildDate>Tue, 01 Dec 2009 13:03:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4-alpha</generator>
		<item>
		<title>La funzione __autoload di PHP</title>
		<link>http://www.ciarpame.com/2009/12/01/la-funzione-__autoload-di-php/</link>
		<comments>http://www.ciarpame.com/2009/12/01/la-funzione-__autoload-di-php/#comments</comments>
		<pubDate>Tue, 01 Dec 2009 12:54:41 +0000</pubDate>
		<dc:creator>Mattia Palugan</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[autoloading]]></category>
		<category><![CDATA[classes]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.ciarpame.com/?p=667</guid>
		<description><![CDATA[La funzione __autoload di PHP è una funzione molto utile per includere delle classi solo quando servono e senza doverle includere a mano. Se esiste, questa funzione, infatti, viene richiamata quando si tenta di utilizzare una classe o un&#8217;interfaccia che non è stata ancora dichiarata. Ha un unico parametro che è il nome della classe [...]]]></description>
			<content:encoded><![CDATA[<p>La funzione <a title="PHP: Autoloading Classes" href="http://www.php.net/autoload">__autoload</a> di PHP è una funzione molto utile per includere delle classi solo quando servono e senza doverle includere a mano.<br />
<span id="more-667"></span><br />
Se esiste, questa funzione, infatti, viene richiamata quando si tenta di utilizzare una classe o un&#8217;interfaccia che non è stata ancora dichiarata.<br />
Ha un unico parametro che è il nome della classe che è possibile manipolare per arrivare al nome del file che la include e non restituisce nulla.<br />
Ecco un esempio dove le classi sono contenute in una cartella con il percorso definito nella costante <em>_CLASS</em> e in file con il nome “nomeclasse.class.php”:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #009933; font-style: italic;">/**
* Autoload delle classi
* @param string $c nome della classe
*/</span>
<span style="color: #000000; font-weight: bold;">function</span> __autoload<span style="color: #009900;">&#40;</span><span style="color: #000088;">$class_name</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$path</span> <span style="color: #339933;">=</span>  _CLASS<span style="color: #339933;">.</span><span style="color: #990000;">strtolower</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$class_name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'.class.php'</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$path</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">require_once</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$path</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #990000;">unset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$path</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.ciarpame.com/2009/12/01/la-funzione-__autoload-di-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Interfacce e classi astratte&#8230;queste sconosciute</title>
		<link>http://www.ciarpame.com/2008/10/16/le-interfacce-e-classi-astrattequeste-sconosciute/</link>
		<comments>http://www.ciarpame.com/2008/10/16/le-interfacce-e-classi-astrattequeste-sconosciute/#comments</comments>
		<pubDate>Thu, 16 Oct 2008 12:22:34 +0000</pubDate>
		<dc:creator>Daniele Veratti</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[classes]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.ciarpame.com/?p=197</guid>
		<description><![CDATA[Ieri qualcuno mi ha chiesto se programmando in PHP avessi mai usato la keyword &#8216;implements&#8217;. Ho risposto &#8220;raramente, uso più spesso &#8216;abstract&#8217; &#8220;. Per quanto possano essere simili interfacce e classi astratte sono però due cose ben distinte. Facciamo un po&#8217; di chiarezza. Una classe astratta è una classe che non può essere istanziata, ma [...]]]></description>
			<content:encoded><![CDATA[<p>Ieri qualcuno  mi ha chiesto se programmando in PHP avessi mai usato la keyword &#8216;implements&#8217;. Ho risposto &#8220;raramente, uso più spesso &#8216;abstract&#8217; &#8220;. Per quanto possano essere simili interfacce e classi astratte sono però due cose ben distinte. Facciamo un po&#8217; di chiarezza.<br />
<span id="more-197"></span></p>
<p>Una classe astratta è una classe che non può essere istanziata, ma che può essere estesa da altre classi. Prendiamo per esempio questa classe astratta:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">abstract <span style="color: #000000; font-weight: bold;">class</span> Personaggio <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$nome</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$nome</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>nome <span style="color: #339933;">=</span> <span style="color: #000088;">$nome</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> saluta<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #b1b100;">return</span> <span style="color: #0000ff;">&quot;Ciao! Io sono &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>nome<span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Se tentassimo di istanziare questa classe con</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$pippo</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Personaggio<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Pippo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>l&#8217;interprete PHP ci risponderebbe con: &#8220;Fatal error: Cannot instantiate abstract class Personaggio&#8221;.</p>
<p>Possiamo però creare una nuova classe che estenda Personaggio:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Pippo <span style="color: #000000; font-weight: bold;">extends</span> Personaggio <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        parent<span style="color: #339933;">::</span>__construct<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Pippo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>La classe Pippo eredita i metodi e gli attributi di Personaggio e ha una redifinizione del costruttore, dove si va esplicitamente a richiamare il costruttore della classe astratta, specificando però un parametro costante per questa classe (la stringa &#8220;Pippo&#8221;). Possiamo quindi istanziare Pippo ed utilizzare i metodi della classe personaggio:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$pippo</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Pippo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$pippo</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>saluta<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>L&#8217;output di questo banale programma è la stringa &#8220;Ciao! Io sono Pippo&#8221;. Le classi astratte quindi servono quando si devono implementare della classi ha hanno alcune operazioni in comune. Le classi che estendono una classe astratta possono poi avere dei metodi propri o ridefinire i metodi già definiti nella classe astratta.</p>
<p>Le interfacce invece definiscono un &#8220;prototipo&#8221; di una classe. Tutte le classi che implementano un&#8217;interfaccia devono definirne tutti i metodi. Vediamo un esempio di utilizzo:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">interface</span> Personaggio <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> saluta<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">class</span> Pippo implements Personaggio <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$nome</span><span style="color: #339933;">;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>nome <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Pippo&quot;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> saluta<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #b1b100;">return</span> <span style="color: #0000ff;">&quot;Ciao! Io sono &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>nome<span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$pippo</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Pippo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$pippo</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>saluta<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Apparentemente l&#8217;uso di una classe astratta o di una interfaccia sembra pressoché indifferente, soprattutto perché PHP non è un linguaggio fortemente tipizzato, ma il concetto che sta alla base di uno o dell&#8217;altro cambia: una classe Pippo che estende una classe astratta Personaggio è una classe di tipo &#8220;Pippo&#8221; che eredita i metodi e gli attributi della classe &#8220;Personaggio&#8221;. Una classe Pippo che implementa un&#8217;interfaccia &#8220;Personaggio&#8221; è sia una classe di tipo &#8220;Pippo&#8221; che di tipo &#8220;Personaggio&#8221;.<br />
Questa differenza si noterebbe di più se si potesse dichiarare il tipo degli argomenti di una funzione (come ad esempio avviene in Java).<br />
Ammettiamo che lo si possa fare anche in PHP e che abbiamo la seguente funzione:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> incontra<span style="color: #009900;">&#40;</span>Personaggio <span style="color: #000088;">$p</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$p</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>saluta<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Se usiamo le interfacce non abbiamo nessun problema a far passare come argomento un&#8217;istanza di Pippo, mentre se Pippo è una classe che ne estende una astratta Personaggio, per poter far passare come argomento della funzione una istanza di Pippo dovremmo farne il downcast a Personaggio.</p>
<p>Riepilogando: l&#8217;uso delle classi astratte che vengono estese è utile quando si devono implementare più classi che hanno metodi e attributi in comune, ma dove il &#8220;caso base&#8221; (la classe astratta) non è ammissibile.<br />
L&#8217;uso delle interfacce invece è utile quando le classi devono essere dello stesso tipo, ma ogni volta devono implementare i metodi dell&#8217;interfaccia in modo differente. Vediamo ora un esempio più concreto:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Definiamo un'interfaccia Forma con un metodo getArea()</span>
<span style="color: #000000; font-weight: bold;">interface</span> Forma <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getArea<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #666666; font-style: italic;">// Definiamo ora le implementazioni di Forma, per semplicità sono stati omessi i costruttori. Ammettiamo che comunque abbiano dei</span>
<span style="color: #666666; font-style: italic;">// parametri per impostare gli attributi delle varie classi</span>
<span style="color: #000000; font-weight: bold;">class</span> Quadrato implements Forma <span style="color: #009900;">&#123;</span>
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getArea<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>lato<span style="color: #339933;">*</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>lato<span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">class</span> Cerchio implements Forma <span style="color: #009900;">&#123;</span>
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getArea<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>raggio<span style="color: #339933;">*</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>raggio<span style="color: #339933;">*</span><span style="color:#800080;">3.14</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">class</span> Triangolo implements Forma <span style="color: #009900;">&#123;</span>
   <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getArea<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>base<span style="color: #339933;">*</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>altezza<span style="color: #339933;">/</span><span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #666666; font-style: italic;">// Definiamo ora una funzione in &quot;stile Java&quot; che stampi a video l'area di una forma</span>
<span style="color: #000000; font-weight: bold;">function</span> stampaArea<span style="color: #009900;">&#40;</span>Forma <span style="color: #000088;">$f</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$f</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>getArea<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #666666; font-style: italic;">// Proviamo ad utilizzare le implementazione dell'interfaccia Forma con questa funzione</span>
<span style="color: #000088;">$t</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Triangolo<span style="color: #009900;">&#40;</span><span style="color: #000088;">$base</span><span style="color: #339933;">,</span><span style="color: #000088;">$altezza</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$q</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Quadrato<span style="color: #009900;">&#40;</span><span style="color: #000088;">$lato</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
stampaArea<span style="color: #009900;">&#40;</span><span style="color: #000088;">$t</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
stampaArea<span style="color: #009900;">&#40;</span><span style="color: #000088;">$q</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.ciarpame.com/2008/10/16/le-interfacce-e-classi-astrattequeste-sconosciute/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

