<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.oop5.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'it',
  ),
  'this' => 
  array (
    0 => 'language.oop5.basic.php',
    1 => 'Nozioni di base',
    2 => 'Nozioni di base',
  ),
  'up' => 
  array (
    0 => 'language.oop5.php',
    1 => 'Classi e Oggetti',
  ),
  'prev' => 
  array (
    0 => 'oop5.intro.php',
    1 => 'Introduzione',
  ),
  'next' => 
  array (
    0 => 'language.oop5.properties.php',
    1 => 'Properties',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'it',
    'path' => 'language/oop5/basic.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.oop5.basic" class="sect1">
  <h2 class="title">Nozioni di base</h2>

  <div class="sect2" id="language.oop5.basic.class">
   <h3 class="title">class</h3>
   <p class="para">
    La definizione più semplice di una classe è composta
    dal termine <code class="literal">class</code>, seguito dal nome della classe,
    seguito da una coppia di parentesi graffe che racchiudono le definizioni
    delle proprietà e dei metodi che fanno parte della classe stessa.
   </p>
   <p class="para">
    Il nome della classe può essere una qualunque etichetta valida che non 
    sia una <a href="reserved.php" class="link">parola riservata</a> di PHP. 
    Un nome di classe valido inizia con una lettera o un underscore, seguiti da 
    lettere, numeri, o underscores. Questa regola può essere rappresentata 
    dalla seguente espressione regolare:
    <code class="literal">^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$</code>.
   </p>
   <p class="para">
    Una classe può contenere le proprie 
    <a href="language.oop5.constants.php" class="link">costanti</a>, <a href="language.oop5.properties.php" class="link">variabili</a>
    (chiamate &quot;proprietà&quot;), e funzioni (chiamate &quot;methods&quot;).
   </p>
   <div class="example" id="example-1">
    <p><strong>Example #1 Semplice definizione di una classe</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">SimpleClass<br /></span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// dichiarazione di proprietà<br />    </span><span style="color: #007700">public </span><span style="color: #0000BB">$var </span><span style="color: #007700">= </span><span style="color: #DD0000">'un valore di default'</span><span style="color: #007700">;<br /><br />    </span><span style="color: #FF8000">// dichiarazione di metodi<br />    </span><span style="color: #007700">public function </span><span style="color: #0000BB">mostraVar</span><span style="color: #007700">() {<br />        echo </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">var</span><span style="color: #007700">;<br />    }<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
   <p class="para">
    La pseudo-variabile <var class="varname">$this</var> è disponibile quando un 
    metodo è invocato dall&#039;interno del contesto di un oggetto. 
    <var class="varname">$this</var> è il valore dell&#039;oggetto chiamante.
   </p>
   <div class="warning"><strong class="warning">Avviso</strong>
    <p class="para">
     La chiamata in modo statico di un metodo non statico genera un
     <span class="classname"><a href="class.error.php" class="classname">Error</a></span>.
     Prima di PHP 8.0.0, questo generava un avviso di deprecazione
     e <var class="varname">$this</var> non sarebbe stato definito.
    </p>
    <div class="example" id="language.oop5.basic.class.this">
     <p><strong>Example #2 Esempi della pseudo-variabile <var class="varname">$this</var></strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">A<br /></span><span style="color: #007700">{<br />    function </span><span style="color: #0000BB">foo</span><span style="color: #007700">()<br />    {<br />        if (isset(</span><span style="color: #0000BB">$this</span><span style="color: #007700">)) {<br />            echo </span><span style="color: #DD0000">'$this è definito ('</span><span style="color: #007700">;<br />            echo </span><span style="color: #0000BB">get_class</span><span style="color: #007700">(</span><span style="color: #0000BB">$this</span><span style="color: #007700">);<br />            echo </span><span style="color: #DD0000">")\n"</span><span style="color: #007700">;<br />        } else {<br />            echo </span><span style="color: #DD0000">"\$this non è definito.\n"</span><span style="color: #007700">;<br />        }<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">B<br /></span><span style="color: #007700">{<br />    function </span><span style="color: #0000BB">bar</span><span style="color: #007700">()<br />    {<br />        </span><span style="color: #0000BB">A</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">();<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= new </span><span style="color: #0000BB">A</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$a</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">foo</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">A</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= new </span><span style="color: #0000BB">B</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$b</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bar</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">B</span><span style="color: #007700">::</span><span style="color: #0000BB">bar</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

     <div class="example-contents"><p>Output of the above example in PHP 7:</p></div>
     <div class="example-contents screen">
<div class="cdata"><pre>
$this è definito (A)

Deprecated: Non-static method A::foo() should not be called statically in %s  on line 27
$this non è definito.

Deprecated: Non-static method A::foo() should not be called statically in %s  on line 20
$this non è definito.

Deprecated: Non-static method B::bar() should not be called statically in %s  on line 32

Deprecated: Non-static method A::foo() should not be called statically in %s  on line 20
$this non è definito.
</pre></div>
     </div>
     <div class="example-contents"><p>Output of the above example in PHP 8:</p></div>
     <div class="example-contents screen">
<div class="cdata"><pre>
$this è definito (A)

Fatal error: Uncaught Error: Non-static method A::foo() cannot be called statically in %s :27
Stack trace:
#0 {main}
  thrown in %s  on line 27
</pre></div>
     </div>
    </div>
   </div>

   <div class="sect3" id="language.oop5.basic.class.readonly">
    <h4 class="title">Classi readonly</h4>
    <p class="para">
     A partire da PHP 8.2.0, una classe può essere marcata con il
     modificatore <span class="modifier">readonly</span>.
     Marcando una classe come <span class="modifier">readonly</span> si aggiungerà il
     <a href="language.oop5.properties.php#language.oop5.properties.readonly-properties" class="link">modificatore <span class="modifier">readonly</span></a>
     ad ogni proprietà dichiarata, e preverrà la creazione di
     <a href="language.oop5.properties.php#language.oop5.properties.dynamic-properties" class="link">proprietà dinamiche</a>.
     Inoltre, è impossibile aggiungere il loro supporto utilizzando
     l&#039;attributo <span class="classname"><a href="class.allowdynamicproperties.php" class="classname">AllowDynamicProperties</a></span>. Provando ad utilizzarlo
     si innescherà un errore in fase di compilazione.
    </p>
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">#[</span><span style="color: #0000BB">\AllowDynamicProperties</span><span style="color: #007700">]<br />readonly class </span><span style="color: #0000BB">Foo </span><span style="color: #007700">{<br />}<br /><br /></span><span style="color: #FF8000">// Fatal error: Cannot apply #[AllowDynamicProperties] to readonly class Foo<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>

    <p class="para">
     Poiché né le proprietà non tipizzate né quelle statiche possono essere contrassegnate con il
     modificatore <code class="literal">readonly</code>, le classi readonly non possono dichiarare
     nemmeno loro:
    </p>
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">readonly class </span><span style="color: #0000BB">Foo<br /></span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">$bar</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #FF8000">// Fatal error: Readonly property Foo::$bar must have type<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">readonly class </span><span style="color: #0000BB">Foo<br /></span><span style="color: #007700">{<br />    public static </span><span style="color: #0000BB">int $bar</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #FF8000">// Fatal error: Readonly class Foo cannot declare static properties<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
    <p class="para">
     Una classe <span class="modifier">readonly</span> può essere
     <a href="language.oop5.basic.php#language.oop5.basic.extends" class="link">estesa</a>
     se, e solo se, la classe figlia è anche una
     classe <span class="modifier">readonly</span>.
    </p>
   </div>
  </div>

  <div class="sect2" id="language.oop5.basic.new">
   <h3 class="title">new</h3>
   <p class="para">
    Per creare un&#039;istanza di una classe, deve essere usata la parola chiave <code class="literal">new</code>.
    Un oggetto sarà sempre creato a meno che la classe abbia un 
    <a href="language.oop5.decon.php" class="link">costruttore</a> definito il quale sollevi un&#039;
    <a href="language.exceptions.php" class="link">eccezione</a> in caso di errore. Le classi 
    dovrebbero essere definite prima dell&#039;istanziazione (in alcuni casi questo è un 
    requisito).
   </p>
   <p class="para">
    Se viene usata una <span class="type">stringa</span> contenente il nome di una classe con
    <code class="literal">new</code>, verrà creata una nuova istanza di quella classe. Se
    la classe appartiene ad un namespace, deve essere utilizzato il suo nome completamente 
    qualificato.
   </p>

   <blockquote class="note"><p><strong class="note">Nota</strong>: 
    <p class="para">
     Se non ci sono argomenti da passare al costruttore della classe,
     le parentesi dopo il nome della classe possono essere omesse.
    </p>
   </p></blockquote>

   <div class="example" id="example-2">
    <p><strong>Example #3 Creazione di un&#039;istanza</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$instance </span><span style="color: #007700">= new </span><span style="color: #0000BB">SimpleClass</span><span style="color: #007700">();<br /><br /></span><span style="color: #FF8000">// è anche possibile istanziare una classe il cui nome sia contenuto in una variabile:<br /></span><span style="color: #0000BB">$className </span><span style="color: #007700">= </span><span style="color: #DD0000">'SimpleClass'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$instance </span><span style="color: #007700">= new </span><span style="color: #0000BB">$className</span><span style="color: #007700">(); </span><span style="color: #FF8000">// new SimpleClass()<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
   <p class="para">
    Da PHP 8.0.0, l&#039;utilizzo di <code class="literal">new</code> con espressioni arbitrarie
    è supportato. Ciò consente istanziazioni più complesse se l&#039;espressione
    produce una <span class="type">stringa</span>. Le espressioni devono essere racchiuse tra parentesi.
   </p>
   <div class="example" id="example-3">
    <p><strong>Example #4 Creazione di un&#039;istanza utilizzando un&#039;espressione arbitraria</strong></p>
    <div class="example-contents"><p>
     Nell&#039;esempio fornito mostriamo più esempi di espressioni arbitrarie valide che producono un nome di classe.
     Questo mostra una chiamata a una funzione, la concatenazione di stringhe e la costante <strong><code>::class</code></strong>.
    </p></div>
    <div class="example-contents">
     <div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">ClassA </span><span style="color: #007700">extends </span><span style="color: #0000BB">\stdClass </span><span style="color: #007700">{}<br />class </span><span style="color: #0000BB">ClassB </span><span style="color: #007700">extends </span><span style="color: #0000BB">\stdClass </span><span style="color: #007700">{}<br />class </span><span style="color: #0000BB">ClassC </span><span style="color: #007700">extends </span><span style="color: #0000BB">ClassB </span><span style="color: #007700">{}<br />class </span><span style="color: #0000BB">ClassD </span><span style="color: #007700">extends </span><span style="color: #0000BB">ClassA </span><span style="color: #007700">{}<br /><br />function </span><span style="color: #0000BB">getSomeClass</span><span style="color: #007700">(): </span><span style="color: #0000BB">string<br /></span><span style="color: #007700">{<br />    return </span><span style="color: #DD0000">'ClassA'</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(new (</span><span style="color: #0000BB">getSomeClass</span><span style="color: #007700">()));<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(new (</span><span style="color: #DD0000">'Class' </span><span style="color: #007700">. </span><span style="color: #DD0000">'B'</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(new (</span><span style="color: #DD0000">'Class' </span><span style="color: #007700">. </span><span style="color: #DD0000">'C'</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(new (</span><span style="color: #0000BB">ClassD</span><span style="color: #007700">::class));<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    <div class="example-contents"><p>Output of the above example in PHP 8:</p></div>
    <div class="example-contents screen">
     <div class="cdata"><pre>
object(ClassA)#1 (0) {
}
object(ClassB)#1 (0) {
}
object(ClassC)#1 (0) {
}
object(ClassD)#1 (0) {
}

</pre></div>
    </div>
   </div>
   <p class="para">
    Nel contesto di una classe, è possibile creare un nuovo oggetto con le espressioni
    <code class="literal">new self</code> e <code class="literal">new parent</code>.
   </p>
   <p class="para">
    Quando si assegna un&#039;istanza già creata ad una nuova variabile, la nuova variabile
    farà riferimento alla stessa istanza cui fa riferimento la variabile originale. Questo stesso
    comportamento si ha quando vengono passate istanze ad una funzione. Si può ottenere una copia
    di un oggetto già creato per mezzo della 
    <a href="language.oop5.cloning.php" class="link">clonazione</a>.
   </p>
   <div class="example" id="example-4">
    <p><strong>Example #5 Assegnazione di oggetti</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$instance </span><span style="color: #007700">= new </span><span style="color: #0000BB">SimpleClass</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">$assigned   </span><span style="color: #007700">=  </span><span style="color: #0000BB">$instance</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$reference  </span><span style="color: #007700">=&amp; </span><span style="color: #0000BB">$instance</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$istance</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">var </span><span style="color: #007700">= </span><span style="color: #DD0000">'$assigned avrà questo valore'</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">$instance </span><span style="color: #007700">= </span><span style="color: #0000BB">null</span><span style="color: #007700">; </span><span style="color: #FF8000">// $instance e $reference diventano null<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$instance</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$reference</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$assigned</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    <div class="example-contents"><p>Il precedente esempio visualizzerà:</p></div>
    <div class="example-contents screen">
<div class="cdata"><pre>
NULL
NULL
object(SimpleClass)#1 (1) {
   [&quot;var&quot;]=&gt;
     string(30) &quot;$assigned avrà questo valore&quot;
}
</pre></div>
    </div>
   </div>
   <p class="para">
    È possibile creare istanze di un oggetto in due modi:
   </p>
   <div class="example" id="example-5">
    <p><strong>Example #6 Creazione di nuovi oggetti</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Test<br /></span><span style="color: #007700">{<br />    static public function </span><span style="color: #0000BB">getNew</span><span style="color: #007700">()<br />    {<br />        return new static;<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">Child </span><span style="color: #007700">extends </span><span style="color: #0000BB">Test<br /></span><span style="color: #007700">{}<br /><br /></span><span style="color: #0000BB">$obj1 </span><span style="color: #007700">= new </span><span style="color: #0000BB">Test</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$obj2 </span><span style="color: #007700">= new </span><span style="color: #0000BB">$obj1</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$obj1 </span><span style="color: #007700">!== </span><span style="color: #0000BB">$obj2</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$obj3 </span><span style="color: #007700">= </span><span style="color: #0000BB">Test</span><span style="color: #007700">::</span><span style="color: #0000BB">getNew</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$obj3 </span><span style="color: #007700">instanceof </span><span style="color: #0000BB">Test</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$obj4 </span><span style="color: #007700">= </span><span style="color: #0000BB">Child</span><span style="color: #007700">::</span><span style="color: #0000BB">getNew</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$obj4 </span><span style="color: #007700">instanceof </span><span style="color: #0000BB">Child</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    <div class="example-contents"><p>Il precedente esempio visualizzerà:</p></div>
    <div class="example-contents screen">
<div class="cdata"><pre>
bool(true)
bool(true)
bool(true)
</pre></div>
    </div>
   </div>

   <p class="para">
    È possibile accedere ad un membro di un oggetto appena creato
    in una singola espressione:
   </p>
   <div class="example" id="example-6">
    <p><strong>Example #7 Accesso al membro dell&#039;oggetto appena creato</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">echo (new </span><span style="color: #0000BB">DateTime</span><span style="color: #007700">())-&gt;</span><span style="color: #0000BB">format</span><span style="color: #007700">(</span><span style="color: #DD0000">'Y'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    <div class="example-contents"><p>Il precedente esempio visualizzerà
qualcosa simile a:</p></div>
    <div class="example-contents screen">
<div class="cdata"><pre>
2016
</pre></div>
    </div>
   </div>

   <blockquote class="note"><p><strong class="note">Nota</strong>: 
    <span class="simpara">
     Prima di PHP 7.1, gli argomenti non vengono valutati se non esiste una funzione
     costruttore definita.
    </span>
   </p></blockquote>
  </div>

  <div class="sect2" id="language.oop5.basic.properties-methods">
   <h3 class="title">Proprietà e metodi</h3>
   <p class="para">
    Le proprietà e i metodi della classe vivono in &quot;namespace&quot; separati, quindi è
    possibile avere una proprietà ed un metodo con lo stesso nome. Dato che
    sia una proprietà che un metodo hanno la stessa notazione, e la scelta se
    verrà letta la proprietà o se verrà chiamato il metodo, dipende solo dal contesto,
    per esempio se l&#039;uso è un accesso ad una variabile o una chiamata ad una funzione.
   </p>
   <div class="example" id="example-7">
    <p><strong>Example #8 Accesso alla proprietà vs. chiamata del metodo</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Foo<br /></span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">$bar </span><span style="color: #007700">= </span><span style="color: #DD0000">'property'</span><span style="color: #007700">;<br />    <br />    public function </span><span style="color: #0000BB">bar</span><span style="color: #007700">() {<br />        return </span><span style="color: #DD0000">'method'</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$obj </span><span style="color: #007700">= new </span><span style="color: #0000BB">Foo</span><span style="color: #007700">();<br />echo </span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bar</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">, </span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bar</span><span style="color: #007700">(), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;</span></span></code></div>
    </div>

    <div class="example-contents"><p>Il precedente esempio visualizzerà:</p></div>
    <div class="example-contents screen">
<div class="cdata"><pre>
property
method
</pre></div>
    </div>
   </div>
   <p class="para">
    Ciò significa che chiamare una <a href="functions.anonymous.php" class="link">funzione
    anonima</a> che è stata assegnata ad una proprietà non è direttamente
    possibile. Per esempio, la proprietà deve essere assegnata prima ad una
    variabile. È possibile chiamare questo tipo di proprietà direttamente
    racchiudendola tra parentesi.
   </p>
   <div class="example" id="example-8">
    <p><strong>Example #9 Chiamare una funzione anonima memorizzata in una proprietà</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Foo<br /></span><span style="color: #007700">{<br />    public </span><span style="color: #0000BB">$bar</span><span style="color: #007700">;<br />    <br />    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">() {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bar </span><span style="color: #007700">= function() {<br />            return </span><span style="color: #0000BB">42</span><span style="color: #007700">;<br />        };<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$obj </span><span style="color: #007700">= new </span><span style="color: #0000BB">Foo</span><span style="color: #007700">();<br /><br />echo (</span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bar</span><span style="color: #007700">)(), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;</span></span></code></div>
    </div>

    <div class="example-contents"><p>Il precedente esempio visualizzerà:</p></div>
    <div class="example-contents screen">
<div class="cdata"><pre>
42
</pre></div>
    </div>
   </div>
  </div>
  
  <div class="sect2" id="language.oop5.basic.extends">
   
   
   <h3 class="title">extends</h3>
   <p class="para">
    Una classe può ereditare le costanti, i metodi e le proprietà di un&#039;altra classe 
    utilizzando la parola chiave <code class="literal">extends</code> nella dichiarazione
    della classe. Non è possibile estendere più di una classe per volta; ogni classe può
    ereditare da una sola altra classe.
   </p>
   <p class="para">
    Le costanti, i metodi e le proprietà ereditate possono essere sovrascritte
    ridichiarandole nella nuova classe con lo stesso nome definito nella classe
    padre. Questo non sarà comunque possibile se il metodo o la costante
    che si intende ridefinire è stato dichiarato nella classe padre come
    <a href="language.oop5.final.php" class="link">final</a>.  Si può accedere alle proprietà
    statiche e ai metodi ridefiniti riferendosi ad essi 
    con <a href="language.oop5.paamayim-nekudotayim.php" class="link">parent::</a>.
   </p>
   <blockquote class="note"><p><strong class="note">Nota</strong>: 
    <span class="simpara">
     A partire da PHP 8.1.0, le costanti possono essere dichiarate come final.
    </span>
   </p></blockquote>
   <div class="example" id="example-9">
    <p><strong>Example #10 Ereditarietà semplice</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">ExtendClass </span><span style="color: #007700">extends </span><span style="color: #0000BB">SimpleClass<br /></span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// Ridefinisce il metodo presente in ClasseSemplice<br />    </span><span style="color: #007700">function </span><span style="color: #0000BB">displayVar</span><span style="color: #007700">()<br />    {<br />        echo </span><span style="color: #DD0000">"Classe figlia\n"</span><span style="color: #007700">;<br />        </span><span style="color: #0000BB">parent</span><span style="color: #007700">::</span><span style="color: #0000BB">displayVar</span><span style="color: #007700">();<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$extended </span><span style="color: #007700">= new </span><span style="color: #0000BB">ExtendClass</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$extended</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">displayVar</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    <div class="example-contents"><p>Il precedente esempio visualizzerà:</p></div>
    <div class="example-contents screen">
<div class="cdata"><pre>
Classe figlia
un valore di default
</pre></div>
    </div>
   </div>

   <div class="sect3" id="language.oop.lsp">
    <h4 class="title">Regole di compatibilità della firma</h4>
    <p class="para">
     Quando si sovrascrive un metodo, la sua firma deve essere compatibile con il metodo
     padre. Altrimenti, viene emesso un errore fatale o, prima di PHP 8.0.0, viene
     generato un errore di livello <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong>.
     Una firma è compatibile se rispetta le
     regole di <a href="language.oop5.variance.php" class="link">varianza</a>, rende
     facoltativo un parametro obbligatorio e se i nuovi parametri sono opzionali.
     Questo è noto come Principio di Sostituzione di Liskov, o LSP in breve.
     I metodi <a href="language.oop5.decon.php#language.oop5.decon.constructor" class="link">costruttore</a>
     e <code class="literal">privati</code> sono esenti da queste regole di
     compatibilità della firma e quindi non genereranno un errore fatale nel caso di una
     mancata corrispondenza della firma.
    </p>
    <div class="example" id="example-10">
     <p><strong>Example #11 Metodi figli compatibili</strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Base<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">int $a</span><span style="color: #007700">) {<br />        echo </span><span style="color: #DD0000">"Valido\n"</span><span style="color: #007700">;<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">Extend1 </span><span style="color: #007700">extends </span><span style="color: #0000BB">Base<br /></span><span style="color: #007700">{<br />    function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">int $a </span><span style="color: #007700">= </span><span style="color: #0000BB">5</span><span style="color: #007700">)<br />    {<br />        </span><span style="color: #0000BB">parent</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">);<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">Extend2 </span><span style="color: #007700">extends </span><span style="color: #0000BB">Base<br /></span><span style="color: #007700">{<br />    function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">int $a</span><span style="color: #007700">, </span><span style="color: #0000BB">$b </span><span style="color: #007700">= </span><span style="color: #0000BB">5</span><span style="color: #007700">)<br />    {<br />        </span><span style="color: #0000BB">parent</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">);<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$extended1 </span><span style="color: #007700">= new </span><span style="color: #0000BB">Extend1</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$extended1</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">foo</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$extended2 </span><span style="color: #007700">= new </span><span style="color: #0000BB">Extend2</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">$extended2</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">1</span><span style="color: #007700">);</span></span></code></div>
     </div>

     <div class="example-contents"><p>Il precedente esempio visualizzerà:</p></div>
     <div class="example-contents screen">
<div class="cdata"><pre>
Valido
Valido
</pre></div>
     </div>
    </div>

    <p class="para">
     I seguenti esempi dimostrano che un metodo figlio che rimuove un parametro o rende obbligatorio un
     parametro facoltativo non è compatibile con il metodo padre.
    </p>
    <div class="example" id="example-11">
     <p><strong>Example #12 Errore fatale quando un metodo figlio rimuove un parametro</strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Base<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">int $a </span><span style="color: #007700">= </span><span style="color: #0000BB">5</span><span style="color: #007700">) {<br />        echo </span><span style="color: #DD0000">"Valido\n"</span><span style="color: #007700">;<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">Extend </span><span style="color: #007700">extends </span><span style="color: #0000BB">Base<br /></span><span style="color: #007700">{<br />    function </span><span style="color: #0000BB">foo</span><span style="color: #007700">()<br />    {<br />        </span><span style="color: #0000BB">parent</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">1</span><span style="color: #007700">);<br />    }<br />}</span></span></code></div>
     </div>

     <div class="example-contents"><p>Output of the above example in PHP 8 is similar to:</p></div>
     <div class="example-contents screen">
<div class="cdata"><pre>
Fatal error: Declaration of Extend::foo() must be compatible with Base::foo(int $a = 5) in /in/evtlq on line 13
</pre></div>
     </div>
    </div>
    <div class="example" id="example-12">
     <p><strong>Example #13 Errore fatale quando un metodo figlio rende obbligatorio un parametro facoltativo</strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Base<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">int $a </span><span style="color: #007700">= </span><span style="color: #0000BB">5</span><span style="color: #007700">) {<br />        echo </span><span style="color: #DD0000">"Valido\n"</span><span style="color: #007700">;<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">Extend </span><span style="color: #007700">extends </span><span style="color: #0000BB">Base<br /></span><span style="color: #007700">{<br />    function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">int $a</span><span style="color: #007700">)<br />    {<br />        </span><span style="color: #0000BB">parent</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">);<br />    }<br />}</span></span></code></div>
     </div>

     <div class="example-contents"><p>Output of the above example in PHP 8 is similar to:</p></div>
     <div class="example-contents screen">
<div class="cdata"><pre>
Fatal error: Declaration of Extend::foo(int $a) must be compatible with Base::foo(int $a = 5) in /in/qJXVC on line 13
</pre></div>
     </div>
    </div>

    <div class="warning"><strong class="warning">Avviso</strong>
     <p class="para">
      Rinominare il parametro di un metodo in una classe figlia non è un&#039;incompatibilità
      di firma. Tuttavia, questo è sconsigliato poiché risulterà in un
      <span class="classname"><strong class="classname">Errore</strong></span> di runtime se
      vengono utilizzati gli
      <a href="functions.arguments.php#functions.named-arguments" class="link">argomenti con nome</a>.
     </p>
     <div class="example" id="example-13">
      <p><strong>Example #14 Errore durante l&#039;utilizzo di argomenti e parametri con nome rinominati in una classe figlia</strong></p>
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">A </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">test</span><span style="color: #007700">(</span><span style="color: #0000BB">$foo</span><span style="color: #007700">, </span><span style="color: #0000BB">$bar</span><span style="color: #007700">) {}<br />}<br /><br />class </span><span style="color: #0000BB">B </span><span style="color: #007700">extends </span><span style="color: #0000BB">A </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">test</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">, </span><span style="color: #0000BB">$b</span><span style="color: #007700">) {}<br />}<br /><br /></span><span style="color: #0000BB">$obj </span><span style="color: #007700">= new </span><span style="color: #0000BB">B</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// Passa i parametri in base al contratto A::test()<br /></span><span style="color: #0000BB">$obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">test</span><span style="color: #007700">(</span><span style="color: #0000BB">foo</span><span style="color: #007700">: </span><span style="color: #DD0000">"foo"</span><span style="color: #007700">, </span><span style="color: #0000BB">bar</span><span style="color: #007700">: </span><span style="color: #DD0000">"bar"</span><span style="color: #007700">); </span><span style="color: #FF8000">// ERRORE!</span></span></code></div>
      </div>

      <div class="example-contents"><p>Il precedente esempio visualizzerà
qualcosa simile a:</p></div>
      <div class="example-contents screen">
<div class="cdata"><pre>
Fatal error: Uncaught Error: Unknown named parameter $foo in /in/XaaeN:14
Stack trace:
#0 {main}
  thrown in /in/XaaeN on line 14
</pre></div>
      </div>
     </div>
    </div>
   </div>
  </div>
  
  <div class="sect2" id="language.oop5.basic.class.class">
   <h3 class="title">::class</h3>

   <p class="para">
    La parola chiave <code class="literal">class</code> è anche usata per la risoluzione
    del nome della classe.
    Per ottenere il nome completo di una classe <code class="literal">ClassName</code>
    utilizzare <code class="literal">ClassName::class</code>. Questo è particolarmente utile con
    le classi presenti nei <a href="language.namespaces.php" class="link">namespace</a>.
   </p>
   <p class="para">
    <div class="example" id="language.oop5.basic.class.class.name">
     <p><strong>Example #15 Risoluzione del nome della classe</strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">namespace </span><span style="color: #0000BB">NS </span><span style="color: #007700">{<br />    class </span><span style="color: #0000BB">ClassName </span><span style="color: #007700">{<br />    }<br />    <br />    echo </span><span style="color: #0000BB">ClassName</span><span style="color: #007700">::class;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

     <div class="example-contents"><p>Il precedente esempio visualizzerà:</p></div>
     <div class="example-contents screen">
<div class="cdata"><pre>
NS\ClassName
</pre></div>
     </div>
    </div>
   </p>
   <blockquote class="note"><p><strong class="note">Nota</strong>: 
    <p class="para">La risoluzione del nome della classe utilizzando <code class="literal">::class</code> è una
     trasformazione in fase di compilazione. Ciò significa che al momento della creazione della stringa del nome
     della classe non è ancora stato eseguito il caricamento automatico. Di conseguenza, i nomi delle classi
     vengono espansi anche se la classe non esiste. In questo caso non viene emesso
     alcun errore.
    </p>
    <div class="example" id="language.oop5.basic.class.class.fail">
     <p><strong>Example #16 Risoluzione del nome della classe mancante</strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">print </span><span style="color: #0000BB">Does\Not\Exist</span><span style="color: #007700">::class;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

     <div class="example-contents"><p>Il precedente esempio visualizzerà:</p></div>
     <div class="example-contents screen">
<div class="cdata"><pre>
Does\Not\Exist
</pre></div>
     </div>
    </div>
   </p></blockquote>
   <p class="para">
    A partire da PHP 8.0.0, la costante <code class="literal">::class</code> può essere utilizzata anche sugli
    oggetti. Questa risoluzione avviene in fase di esecuzione, non in fase di compilazione. Il suo effetto è
    lo stesso della chiamata di <span class="function"><a href="function.get-class.php" class="function">get_class()</a></span> sull&#039;oggetto.
   </p>
   <div class="example" id="language.oop5.basic.class.class.object">
    <p><strong>Example #17 Risoluzione del nome dell&#039;oggetto</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">namespace </span><span style="color: #0000BB">NS </span><span style="color: #007700">{<br />    class </span><span style="color: #0000BB">ClassName </span><span style="color: #007700">{<br />    }<br />}<br /></span><span style="color: #0000BB">$c </span><span style="color: #007700">= new </span><span style="color: #0000BB">ClassName</span><span style="color: #007700">();<br />print </span><span style="color: #0000BB">$c</span><span style="color: #007700">::class;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    <div class="example-contents"><p>Il precedente esempio visualizzerà:</p></div>
    <div class="example-contents screen">
<div class="cdata"><pre>
NS\ClassName
</pre></div>
    </div>
   </div>
  </div>
 <div class="sect2" id="language.oop5.basic.nullsafe">
  <h3 class="title">Metodi e proprietà nullsafe</h3>
  <p class="para">
   A partire da PHP 8.0.0, è possibile accedere alle proprietà e ai metodi anche con
   l&#039;operatore &quot;nullsafe&quot;: <code class="literal">?-&gt;</code>. L&#039;operatore nullsafe
   funziona allo stesso modo dell&#039;accesso alla proprietà o al metodo come sopra, tranne per il fatto che se l&#039;
   oggetto da dereferenziare è <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> allora <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>
   verrà restituito piuttosto che un&#039;eccezione generata. Se la dereferenziazione fa parte di una
   catena, il resto della catena viene saltato.
  </p>
  <p class="para">
   L&#039;effetto è simile ad effettuare prima il wrap su ogni accesso in un controllo
   <span class="function"><a href="function.is-null.php" class="function">is_null()</a></span>, ma più compatto.
  </p>
  <p class="para">
   <div class="example" id="example-14">
    <p><strong>Example #18 L&#039;Operatore Nullsafe</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #FF8000">// A partire da PHP 8.0.0, questa riga:<br /></span><span style="color: #0000BB">$result </span><span style="color: #007700">= </span><span style="color: #0000BB">$repository</span><span style="color: #007700">?-&gt;</span><span style="color: #0000BB">getUser</span><span style="color: #007700">(</span><span style="color: #0000BB">5</span><span style="color: #007700">)?-&gt;</span><span style="color: #0000BB">name</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// È equivalente al seguente blocco di codice:<br /></span><span style="color: #007700">if (</span><span style="color: #0000BB">is_null</span><span style="color: #007700">(</span><span style="color: #0000BB">$repository</span><span style="color: #007700">)) {<br />    </span><span style="color: #0000BB">$result </span><span style="color: #007700">= </span><span style="color: #0000BB">null</span><span style="color: #007700">;<br />} else {<br />    </span><span style="color: #0000BB">$user </span><span style="color: #007700">= </span><span style="color: #0000BB">$repository</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getUser</span><span style="color: #007700">(</span><span style="color: #0000BB">5</span><span style="color: #007700">);<br />    if (</span><span style="color: #0000BB">is_null</span><span style="color: #007700">(</span><span style="color: #0000BB">$user</span><span style="color: #007700">)) {<br />        </span><span style="color: #0000BB">$result </span><span style="color: #007700">= </span><span style="color: #0000BB">null</span><span style="color: #007700">;<br />    } else {<br />        </span><span style="color: #0000BB">$result </span><span style="color: #007700">= </span><span style="color: #0000BB">$user</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">name</span><span style="color: #007700">;<br />    }<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </p>
  <blockquote class="note"><p><strong class="note">Nota</strong>: 
   <p class="para">
    L&#039;operatore nullsafe viene utilizzato al meglio quando null è considerato un valore possibile
    valido e previsto per una proprietà o return di un metodo. Per indicare un errore,
    è preferibile un&#039;eccezione generata.
   </p>
  </p></blockquote>
 </div>
 </div><?php manual_footer($setup); ?>