{"id":1739,"date":"2013-03-07T09:03:51","date_gmt":"2013-03-07T08:03:51","guid":{"rendered":"http:\/\/www.manuelmarangoni.it\/sir-bit\/?p=1739"},"modified":"2013-05-26T14:06:26","modified_gmt":"2013-05-26T13:06:26","slug":"tutorial-uso-delle-classi-in-php-introduzione-di-base","status":"publish","type":"post","link":"https:\/\/www.manuelmarangoni.it\/sir-bit\/1739\/tutorial-uso-delle-classi-in-php-introduzione-di-base\/","title":{"rendered":"Tutorial &#8211; Uso delle classi in php &#8211; Introduzione di base"},"content":{"rendered":"<div id=\"attachment_1744\" style=\"width: 460px\" class=\"wp-caption aligncenter\"><a class=\"lightbox\" title=\"La programmazione a oggetti \u00e8 l'espressione pi\u00f9 efficiente di un linguaggio informatico. I vantaggi sono molti, a partire dall'efficienza\" href=\"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-content\/uploads\/2013\/03\/Cervello-e-chip.jpg\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1744\" class=\"size-medium wp-image-1744 \" style=\"margin-bottom: 5px;\" title=\"Cervello e chip\" alt=\"Cervello e chip\" src=\"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-content\/uploads\/2013\/03\/Cervello-e-chip-450x300.jpg\" width=\"450\" height=\"300\" srcset=\"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-content\/uploads\/2013\/03\/Cervello-e-chip-450x300.jpg 450w, https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-content\/uploads\/2013\/03\/Cervello-e-chip.jpg 990w\" sizes=\"(max-width: 450px) 100vw, 450px\" \/><\/a><p id=\"caption-attachment-1744\" class=\"wp-caption-text\">La programmazione a oggetti \u00e8 l&#8217;espressione pi\u00f9 efficiente di un linguaggio informatico. I vantaggi sono molti, a partire dall&#8217;efficienza (1)<\/p><\/div>\n<p>Con questo articolo iniziamo ad addentrarci in uno dei pilastri portanti della programmazione: l\u2019uso degli oggetti di classe. Il php \u00e8 un linguaggio di programmazione a 360\u00b0 e come gli altri suoi fratelli pi\u00f9 in voga integra un sistema di uso delle classi abbastanza intuitivo.<\/p>\n<p>Una volta conosciute le basi e i primi approfondimenti del php, \u00e8 quasi indispensabile passare alle classi. Perch\u00e9? Le motivazioni sono molte (pi\u00f9 sotto le vedremo nei dettagli), ma <strong>principalmente \u00e8 una questione di professionalit\u00e0 e utilit\u00e0<\/strong>: il codice \u00e8 ben ordinato ed \u00e8 possibile lavorare in pi\u00f9 persone contemporaneamente su un progetto, senza temere di intaccare qualche funzionalit\u00e0 fondamentale.<br \/>\nL&#8217;argomento dell&#8217;uso agli oggetti \u00e8 davvero vasto: con l&#8217;esperienza scoprirete quanto \u00e8 utile e complesso, e che si tratta del vero &#8220;cuore&#8221; dei linguaggi di programmazione, dove il ragionamento e l&#8217;organizzazione fanno la differenza.<\/p>\n<p>Nel tutorial (suddiviso in pi\u00f9 articoli) vedremo un utilizzo di base delle classi. A fine spiegazione <strong>dovreste essere in grado di costruirvi una vostra classe rudimentale<\/strong> e di popolarla con dei metodi.<br \/>\nIn seguito vedremo, inoltre, un esempio semplice e concreto (che potrete liberamente scaricare) dell&#8217;uso di una classe.<br \/>\nSi presumo che abbiate gi\u00e0 una buona conoscenza di base del php e dell\u2019uso di funzioni.<\/p>\n<h3 style=\"margin-top: 50px; margin-bottom: 20px; color: #c00;\">In generale: la programmazione a oggetti<\/h3>\n<p>Con la parola &#8220;oggetti&#8221; non si intende altro che una zona di memoria allocata.<br \/>\nLa &#8220;programmazione orientata agli oggetti&#8221; (che in genere si abbrevvia con OOP, dall&#8217;inglese <em>Object Oriented Programming<\/em>) \u00e8 idealmente un <strong>insieme di strumenti offerti, nel nostro caso, dal php per permettere agli oggetti di interagire tra loro<\/strong>, scambiandosi dei messaggi.<br \/>\nRestringendo, quindi, la OOP \u00e8 una serie di strumenti che permette a due o pi\u00f9 zone di memoria (oggetti) di comunicare tra loro.<!--more--><\/p>\n<p>Fin qui la descrizione generale. Andiamo un po&#8217; pi\u00f9 nel concreto.<br \/>\nQuando lavoriamo con OOP, di qualsiasi linguaggio di programmazione, facciamo uso di quelle che vengono chiamate &#8220;classi&#8221;: si tratta di modelli, che nella pratica possiamo vedere come contenitori di azioni (<em>metodi<\/em>) e di attributi. In pratica la struttura base \u00e8 la seguente:<\/p>\n<div class=\"wp_syntax\">\n<table>\n<tbody>\n<tr>\n<td class=\"line_numbers\">\n<pre>1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n10\r\n11<\/pre>\n<\/td>\n<td class=\"code\">\n<pre class=\"php\" style=\"font-family: monospace;\"><span style=\"color: #000000; font-weight: bold;\">class<\/span> Nome_classe<span style=\"color: #009900;\">{<\/span>\r\n\r\n\t<span style=\"color: #000000; font-weight: bold;\">function<\/span> metodo1<span style=\"color: #009900;\">(<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #009900;\">{<\/span>\r\n\t\t<span style=\"color: #009900;\">[<\/span><span style=\"color: #339933;\">...<\/span><span style=\"color: #009900;\">]<\/span>\r\n\t<span style=\"color: #009900;\">}<\/span>\r\n\r\n\t<span style=\"color: #000000; font-weight: bold;\">function<\/span> metodo2<span style=\"color: #009900;\">(<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #009900;\">{<\/span>\r\n\t\t<span style=\"color: #009900;\">[<\/span><span style=\"color: #339933;\">...<\/span><span style=\"color: #009900;\">]<\/span>\r\n\t<span style=\"color: #009900;\">}<\/span>\r\n\r\n<span style=\"color: #009900;\">}<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>Come notate, i metodi vengono chiamati attraverso l&#8217;uso di &#8220;function&#8221; seguito dal nome: se avete familiarit\u00e0 con le funzioni, vi renderete conto che in effetti i metodi hanno molto in comune con queste (ma non confondete &#8220;metodi&#8221; con &#8220;funzioni&#8221;: sono usate con delle differenze sostanziali).<\/p>\n<p><script type=\"text\/javascript\">\/\/ <![CDATA[\ngoogle_ad_client = \"ca-pub-9984963620559913\"; \/* Sir Bit - post singolo rettangolare *\/ google_ad_slot = \"5334366715\"; google_ad_width = 336; google_ad_height = 280;\n\/\/ ]]><\/script><br \/>\n<script type=\"text\/javascript\" src=\"http:\/\/pagead2.googlesyndication.com\/pagead\/show_ads.js\">\/\/ <![CDATA[\n\n\n\/\/ ]]><\/script><\/p>\n<p>La classe \u00e8 una struttura astratta: di per s\u00e9 non fa niente, raggruppa semplicemente delle azioni e degli attributi.<br \/>\nPer essere usata, la classe deve essere &#8220;istanziata&#8221;: <strong>dobbiamo cio\u00e8 creare un oggetto che permetta di accedere a quella classe<\/strong>. Visivamente si tratta di creare una variabile (che viene chiamata, per l&#8217;appunto &#8220;istanza&#8221;). Grazie a questo oggetto potremmo recuperare tutti i metodi di quella classe. Continuando l&#8217;esempio sopra:<\/p>\n<div class=\"wp_syntax\">\n<table>\n<tbody>\n<tr>\n<td class=\"line_numbers\">\n<pre>1\r\n2\r\n3<\/pre>\n<\/td>\n<td class=\"code\">\n<pre class=\"php\" style=\"font-family: monospace;\"><span style=\"color: #000088;\">$istanza<\/span><span style=\"color: #339933;\">=<\/span><span style=\"color: #000000; font-weight: bold;\">new<\/span> Nome_classe<span style=\"color: #009900;\">(<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #339933;\">;<\/span> <span style=\"color: #666666; font-style: italic;\">\/\/istanzio la classe<\/span>\r\n<span style=\"color: #000088;\">$istanza<\/span><span style=\"color: #339933;\">-&gt;<\/span><span style=\"color: #004000;\">metodo1<\/span><span style=\"color: #339933;\">;<\/span> <span style=\"color: #666666; font-style: italic;\">\/\/accedo al metodo1 della classe<\/span>\r\n<span style=\"color: #000088;\">$istanza<\/span><span style=\"color: #339933;\">-&gt;<\/span><span style=\"color: #004000;\">metodo2<\/span><span style=\"color: #339933;\">;<\/span> <span style=\"color: #666666; font-style: italic;\">\/\/accedo al metodo2 della classe<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<h3 style=\"margin-top: 50px; margin-bottom: 20px; color: #c00;\">Perch\u00e9 usare OOP invece di semplici funzioni<\/h3>\n<p>Qualcuno di voi potrebbe chiedersi quale sia la vera utilit\u00e0 della OOP.<br \/>\nInnanzitutto, l&#8217;uso di classi ci permette <strong>di &#8220;spezzettare&#8221; il codice in pi\u00f9 parti e di recuperare la parte che ci interessa<\/strong> tralasciando tutte le altre. Per esempio, nel nostro sito possiamo costruire una classe che si occupi esclusivamente di stampare i prodotti e un&#8217;altra che esegua il login a un&#8217;area riservata.<\/p>\n<p>Non potrei costruire tutto usando semplicemente le funzioni?<br \/>\nQuesta \u00e8 una domanda che chiunque si pone quando si trova davanti, per la prima volta, alla OOP. Gran parte delle situazioni, in effetti, potrebbero essere &#8220;replicate&#8221; dalle funzioni. Ma:<br \/>\n&#8211; le funzioni sono meno performanti<br \/>\n&#8211; le classi permettono ulteriori funzionalit\u00e0, come <strong>per esempio la possibilit\u00e0 di sovrascrivere i propri metodi<\/strong> (cosa non permessa con le funzioni: una volta creata, la funzione rimane cos\u00ec com&#8217;\u00e8)<br \/>\n&#8211; le classi permettono una gestione pi\u00f9 ordinata<br \/>\n&#8211; le classi permettono a pi\u00f9 persone di lavorare su uno stesso progetto senza &#8220;pestarsi i piedi&#8221;, limitando cos\u00ec gli errori solo a un settore del progetto<br \/>\n&#8211; una classe pu\u00f2 essere &#8220;presa&#8221; (tecnicamente si dice &#8220;estesa&#8221;) da pi\u00f9 classi diverse: in pratica possiamo usare una sola base per creare funzionalit\u00e0 diverse<\/p>\n<p>Queste sono soltanto alcune considerazioni. La vera utilit\u00e0 della OOP sar\u00e0 chiara soltanto con l&#8217;esperienza. Dopotutto, una ragione c&#8217;\u00e8 se viene adoperata in tutti i linguaggi di programmazione pi\u00f9 avanzati&#8230;<\/p>\n<h3 style=\"margin-top: 50px; margin-bottom: 20px; color: #c00;\">Funzionamento di base delle classi<\/h3>\n<p>Sopra abbiamo visto che per richiamare un metodo di classe, <strong>bisogna istanziare quest&#8217;ultima in un oggetto<\/strong>. Dopodich\u00e9 potremo richiamare i metodi di quella classe facendo:<\/p>\n<div class=\"wp_syntax\">\n<table>\n<tbody>\n<tr>\n<td class=\"line_numbers\">\n<pre>1<\/pre>\n<\/td>\n<td class=\"code\">\n<pre class=\"php\" style=\"font-family: monospace;\"><span style=\"color: #000088;\">$oggetto<\/span><span style=\"color: #339933;\">-&gt;<\/span><span style=\"color: #004000;\">metodo<\/span><span style=\"color: #009900;\">(<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #339933;\">;<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>Vediamo cosa possiamo fare all&#8217;interno di una classe e all&#8217;interno di un metodo.<br \/>\nCome punto di riferimento prendiamo la struttura vista a inizio articolo, ovvero la classe <em>Nome_classe<\/em> che contiene al suo interno <em>metodo1<\/em> e <em>metodo2<\/em>. Aggiungiamo qualche altro particolare:<\/p>\n<div class=\"wp_syntax\">\n<table>\n<tbody>\n<tr>\n<td class=\"line_numbers\">\n<pre>1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n10\r\n11\r\n12\r\n13\r\n14\r\n15\r\n16\r\n17<\/pre>\n<\/td>\n<td class=\"code\">\n<pre class=\"php\" style=\"font-family: monospace;\"><span style=\"color: #000000; font-weight: bold;\">class<\/span> Nome_classe<span style=\"color: #009900;\">{<\/span>\r\n\r\n\t<span style=\"color: #000000; font-weight: bold;\">public<\/span> <span style=\"color: #000088;\">$variabile_a<\/span><span style=\"color: #339933;\">=<\/span><span style=\"color: #0000ff;\">\"Prima variabile\"<\/span><span style=\"color: #339933;\">;<\/span>\r\n\tplubic <span style=\"color: #000088;\">$variabile_b<\/span><span style=\"color: #339933;\">=<\/span><span style=\"color: #cc66cc;\">20<\/span><span style=\"color: #339933;\">;<\/span>\r\n\r\n\t<span style=\"color: #000000; font-weight: bold;\">function<\/span> metodo1<span style=\"color: #009900;\">(<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #009900;\">{<\/span>\r\n\t\t<span style=\"color: #b1b100;\">echo<\/span> <span style=\"color: #000088;\">$this<\/span><span style=\"color: #339933;\">-&gt;<\/span><span style=\"color: #004000;\">variabile_b<\/span><span style=\"color: #339933;\">;<\/span>\r\n\t<span style=\"color: #009900;\">}<\/span>\r\n\r\n\t<span style=\"color: #000000; font-weight: bold;\">function<\/span> metodo2<span style=\"color: #009900;\">(<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #009900;\">{<\/span>\r\n\t\t<span style=\"color: #000088;\">$this<\/span><span style=\"color: #339933;\">-&gt;<\/span><span style=\"color: #004000;\">metodo1<\/span><span style=\"color: #009900;\">(<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #339933;\">;<\/span>\r\n\t<span style=\"color: #009900;\">}<\/span>\r\n\r\n<span style=\"color: #009900;\">}<\/span>\r\n\r\n<span style=\"color: #000088;\">$istanza<\/span><span style=\"color: #339933;\">=<\/span><span style=\"color: #000000; font-weight: bold;\">new<\/span> Nome_classe<span style=\"color: #009900;\">(<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #339933;\">;<\/span> <span style=\"color: #666666; font-style: italic;\">\/\/istanzio la classe<\/span>\r\n<span style=\"color: #000088;\">$istanza<\/span><span style=\"color: #339933;\">-&gt;<\/span><span style=\"color: #004000;\">metodo2<\/span><span style=\"color: #009900;\">(<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #339933;\">;<\/span> <span style=\"color: #666666; font-style: italic;\">\/\/accedo al metodo2 della classe<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>Come notiamo qui sopra, <strong>anche all&#8217;interno delle classi possiamo dichiarare delle variabili<\/strong> (che in una classe prendono il nome di <em>propriet\u00e0<\/em>). Alle propriet\u00e0 possiamo assegnare un valore di qualsiasi tipo che conosciamo: stringa, intero, array di valori, ecc. Niente di diverso dalle comuni variabili: l&#8217;unica cosa che cambia \u00e8 l&#8217;attributo <em>public<\/em>, di cui ci occuperemo tra poco.<\/p>\n<p>Se dichiariamo una variabile all&#8217;interno della classe, questa sar\u00e0 visibile in tutti i metodi della classe e potr\u00e0 essere richiamata sempre con &#8220;$this-&gt;nome_variabile&#8221; (notare l&#8217;assenza del $, indispensabile quando si inizializza la variabile nella classe ma errato se usato quando si richiama quella stessa variabile all&#8217;interno di un metodo).<br \/>\nNon solo: l&#8217;attributo <strong><em>$this<\/em> pu\u00f2 essere usato per richiamare un altro metodo della stessa classe<\/strong> (nel nostro esempio, &#8220;metodo2&#8221; richiama &#8220;metodo1&#8221;).<\/p>\n<p>Nell&#8217;esempio, con l&#8217;oggetto di classe istanziato noi richiamiamo &#8220;metodo2&#8221;. A sua volta, il metodo2 richiama &#8220;metodo1&#8221;, che si occupa di stampare a video $variabile_b. Il risultato \u00e8 che a video sar\u00e0 stampato il valore 20.<\/p>\n<h3 style=\"margin-top: 50px; margin-bottom: 20px; color: #c00;\">Passare un parametro a un metodo<\/h3>\n<p>Aggiungiamo adesso un terzo metodo:<\/p>\n<div class=\"wp_syntax\">\n<table>\n<tbody>\n<tr>\n<td class=\"line_numbers\">\n<pre>1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n10\r\n11\r\n12<\/pre>\n<\/td>\n<td class=\"code\">\n<pre class=\"php\" style=\"font-family: monospace;\"><span style=\"color: #000000; font-weight: bold;\">class<\/span> Nome_classe<span style=\"color: #009900;\">{<\/span>\r\n\r\n\t<span style=\"color: #009900;\">[<\/span><span style=\"color: #339933;\">...<\/span><span style=\"color: #009900;\">]<\/span>\r\n\r\n\t<span style=\"color: #000000; font-weight: bold;\">function<\/span> metodo3<span style=\"color: #009900;\">(<\/span><span style=\"color: #000088;\">$parametro<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #009900;\">{<\/span>\r\n\t\t<span style=\"color: #b1b100;\">echo<\/span> <span style=\"color: #000088;\">$parametro<\/span><span style=\"color: #339933;\">;<\/span>\r\n\t<span style=\"color: #009900;\">}<\/span>\r\n\r\n<span style=\"color: #009900;\">}<\/span>\r\n\r\n<span style=\"color: #000088;\">$istanza<\/span><span style=\"color: #339933;\">=<\/span><span style=\"color: #000000; font-weight: bold;\">new<\/span> Nome_classe<span style=\"color: #009900;\">(<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #339933;\">;<\/span>\r\n<span style=\"color: #000088;\">$istanza<\/span><span style=\"color: #339933;\">-&gt;<\/span><span style=\"color: #004000;\">metodo3<\/span><span style=\"color: #009900;\">(<\/span><span style=\"color: #0000ff;\">\"Questa \u00e8 una stringa\"<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #339933;\">;<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>In questo caso abbiamo fatto passare un parametro al metodo. Se notate non si usa l&#8217;attributo $this: questo perch\u00e9 il parametro appartiene unicamente al metodo, non alla classe intera. $parametro, infatti, \u00e8 accessibile soltanto all&#8217;interno di &#8220;metodo3&#8221;, mentre non sar\u00e0 visibile o utilizzabile direttamente in &#8220;metodo1&#8221; e &#8220;metodo2&#8221;.<br \/>\nIl risultato sar\u00e0 la stampa a video di &#8220;Questa \u00e8 una stringa&#8221;.<\/p>\n<h3 style=\"margin-top: 50px; margin-bottom: 20px; color: #c00;\">Una nota sulle propriet\u00e0<\/h3>\n<p>Soffermiamoci adesso sull&#8217;inizializzazione delle propriet\u00e0 (cio\u00e8 delle variabili di classe). Possiamo farlo in diversi modi, per esempio:<\/p>\n<div class=\"wp_syntax\">\n<table>\n<tbody>\n<tr>\n<td class=\"line_numbers\">\n<pre>1\r\n2\r\n3\r\n4<\/pre>\n<\/td>\n<td class=\"code\">\n<pre class=\"php\" style=\"font-family: monospace;\"><span style=\"color: #000000; font-weight: bold;\">var<\/span> <span style=\"color: #000088;\">$a<\/span><span style=\"color: #339933;\">;<\/span>\r\n<span style=\"color: #000000; font-weight: bold;\">public<\/span> <span style=\"color: #000088;\">$b<\/span><span style=\"color: #339933;\">=<\/span><span style=\"color: #0000ff;\">\"Testo\"<\/span><span style=\"color: #339933;\">;<\/span>\r\n<span style=\"color: #000000; font-weight: bold;\">private<\/span> <span style=\"color: #000088;\">$c<\/span><span style=\"color: #339933;\">=<\/span><span style=\"color: #cc66cc;\">10<\/span><span style=\"color: #339933;\">;<\/span>\r\n<span style=\"color: #000000; font-weight: bold;\">protected<\/span> <span style=\"color: #000088;\">$d<\/span><span style=\"color: #339933;\">=<\/span><span style=\"color: #cc66cc;\">20<\/span><span style=\"color: #339933;\">;<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>Nel primo caso ($a) abbiamo semplicemente inizializzato una variabile vuota. Scrivere una cosa del genere sarebbe stato sbagliato:<\/p>\n<div class=\"wp_syntax\">\n<table>\n<tbody>\n<tr>\n<td class=\"line_numbers\">\n<pre>1<\/pre>\n<\/td>\n<td class=\"code\">\n<pre class=\"php\" style=\"font-family: monospace;\"><span style=\"color: #000000; font-weight: bold;\">var<\/span> <span style=\"color: #000088;\">$a<\/span><span style=\"color: #339933;\">=<\/span><span style=\"color: #0000ff;\">\"Stringa\"<\/span><span style=\"color: #339933;\">;<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>Per le altre tre propriet\u00e0 abbiamo assegnato <strong>tre attributi diversi: public, private, protected<\/strong>. Questi tre attributi sono utili per stabilire il loro comportamento all&#8217;esterno della classe: i metodi di una classe, infatti, possono essere ereditati e usati da altre classi (di questo per\u00f2 ci occuperemo nel prossimo articolo).<br \/>\nQuesti stessi attributi possono essere assegnati anche ai metodi, non soltanto alle variabili. Per esempio:<\/p>\n<div class=\"wp_syntax\">\n<table>\n<tbody>\n<tr>\n<td class=\"line_numbers\">\n<pre>1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n10\r\n11<\/pre>\n<\/td>\n<td class=\"code\">\n<pre class=\"php\" style=\"font-family: monospace;\"><span style=\"color: #000000; font-weight: bold;\">public<\/span> <span style=\"color: #000000; font-weight: bold;\">function<\/span> metodo4<span style=\"color: #009900;\">(<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #009900;\">{<\/span>\r\n\t<span style=\"color: #009900;\">[<\/span><span style=\"color: #339933;\">...<\/span><span style=\"color: #009900;\">]<\/span>\r\n<span style=\"color: #009900;\">}<\/span>\r\n\r\n<span style=\"color: #000000; font-weight: bold;\">protected<\/span> <span style=\"color: #000000; font-weight: bold;\">function<\/span> metodo5<span style=\"color: #009900;\">(<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #009900;\">{<\/span>\r\n\t<span style=\"color: #009900;\">[<\/span><span style=\"color: #339933;\">...<\/span><span style=\"color: #009900;\">]<\/span>\r\n<span style=\"color: #009900;\">}<\/span>\r\n\r\n<span style=\"color: #000000; font-weight: bold;\">private<\/span> <span style=\"color: #000000; font-weight: bold;\">function<\/span> metodo6<span style=\"color: #009900;\">(<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #009900;\">{<\/span>\r\n\t<span style=\"color: #009900;\">[<\/span><span style=\"color: #339933;\">...<\/span><span style=\"color: #009900;\">]<\/span>\r\n<span style=\"color: #009900;\">}<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>Vediamoli in breve:<br \/>\n&#8211; <em>public<\/em>: la propriet\u00e0 o metodo \u00e8 visibile dalla classe corrente, dalle sue sottoclassi e quando richiamato all&#8217;esterno<br \/>\n&#8211; <em>protected<\/em>: visibile solo dalla classe corrente e dalle sue sottoclassi<br \/>\n&#8211; <em>private<\/em>: visibile solo dalla classe corrente<\/p>\n<p>Se non specificato, un metodo si considera <em>public<\/em>.<br \/>\nSe cerchiamo, per esempio, di accedere al &#8220;metodo6&#8221; (di tipo <em>private<\/em>) dall&#8217;esterno della classe, ci verr\u00e0 restituito un errore.<\/p>\n<h3 style=\"margin-top: 50px; margin-bottom: 20px; color: #c00;\">Costanti e metodi statici<\/h3>\n<p>Anche <strong>le OOP fanno uso di costanti<\/strong>. Il loro accesso, per\u00f2, \u00e8 diverso da quello a cui siamo abituati con la normale programmazione.<br \/>\nInoltre, le costanti devono essere valori semplici: una stringa, un numero, ecc. Non possono essere, per esempio, il risultato di un&#8217;operazione matematica, un&#8217;assegnazione di variabile o un array.<br \/>\nPer dichiarare la costante &#8220;STATO&#8221; all&#8217;interno di una classe:<\/p>\n<div class=\"wp_syntax\">\n<table>\n<tbody>\n<tr>\n<td class=\"line_numbers\">\n<pre>1\r\n2\r\n3\r\n4\r\n5\r\n6<\/pre>\n<\/td>\n<td class=\"code\">\n<pre class=\"php\" style=\"font-family: monospace;\"><span style=\"color: #000000; font-weight: bold;\">const<\/span> STATO <span style=\"color: #339933;\">=<\/span> <span style=\"color: #0000ff;\">\"Italia\"<\/span><span style=\"color: #339933;\">;<\/span>\r\n\r\n<span style=\"color: #666666; font-style: italic;\">\/\/tutte le seguenti assegnazioni sono errate<\/span>\r\n<span style=\"color: #000000; font-weight: bold;\">const<\/span> RISULTATO <span style=\"color: #339933;\">=<\/span> <span style=\"color: #cc66cc;\">9<\/span><span style=\"color: #339933;\">*<\/span><span style=\"color: #cc66cc;\">8<\/span><span style=\"color: #339933;\">;<\/span>\r\n<span style=\"color: #000000; font-weight: bold;\">const<\/span> RISULTATO <span style=\"color: #339933;\">=<\/span> <span style=\"color: #990000;\">array<\/span><span style=\"color: #009900;\">(<\/span><span style=\"color: #cc66cc;\">9<\/span><span style=\"color: #339933;\">,<\/span> <span style=\"color: #cc66cc;\">8<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #339933;\">;<\/span>\r\n<span style=\"color: #000000; font-weight: bold;\">const<\/span> RISULTATO <span style=\"color: #339933;\">=<\/span> <span style=\"color: #000088;\">$variabile<\/span><span style=\"color: #339933;\">;<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>Come le classiche costanti, il loro valore non pu\u00f2 cambiare una volta inizializzato.<br \/>\nLe costanti non possono essere richiamati come le altre propriet\u00e0: non si possono usare quindi $this o -&gt;.<br \/>\nPer utilizzarle all&#8217;interno di un metodo <strong>utilizzeremo la sintassi &#8220;self::_nome_costante&#8221;<\/strong>, mentre per richiamarla al di fuori della classe dovremmo usare &#8220;nome_classe::nome_costante&#8221;. Per esempio l&#8217;istanza stamper\u00e0 a video in entrambi i casi &#8220;Italia&#8221;:<\/p>\n<div class=\"wp_syntax\">\n<table>\n<tbody>\n<tr>\n<td class=\"line_numbers\">\n<pre>1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n10\r\n11\r\n12\r\n13<\/pre>\n<\/td>\n<td class=\"code\">\n<pre class=\"php\" style=\"font-family: monospace;\"><span style=\"color: #000000; font-weight: bold;\">class<\/span> Nome_classe<span style=\"color: #009900;\">{<\/span>\r\n\r\n\t<span style=\"color: #009900;\">[<\/span><span style=\"color: #339933;\">...<\/span><span style=\"color: #009900;\">]<\/span>\r\n\r\n\t<span style=\"color: #000000; font-weight: bold;\">function<\/span> metodo4<span style=\"color: #009900;\">(<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #009900;\">{<\/span>\r\n\t\t<span style=\"color: #b1b100;\">return<\/span> <span style=\"color: #000000; font-weight: bold;\">self<\/span><span style=\"color: #339933;\">::<\/span><span style=\"color: #004000;\">STATO<\/span><span style=\"color: #339933;\">;<\/span>\r\n\t<span style=\"color: #009900;\">}<\/span>\r\n\r\n<span style=\"color: #009900;\">}<\/span>\r\n\r\n<span style=\"color: #000088;\">$istanza<\/span><span style=\"color: #339933;\">=<\/span><span style=\"color: #000000; font-weight: bold;\">new<\/span> Nome_classe<span style=\"color: #009900;\">(<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #339933;\">;<\/span>\r\n<span style=\"color: #b1b100;\">echo<\/span> <span style=\"color: #000088;\">$istanza<\/span><span style=\"color: #339933;\">-&gt;<\/span><span style=\"color: #004000;\">metodo4<\/span><span style=\"color: #009900;\">(<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #339933;\">;<\/span>\r\n<span style=\"color: #b1b100;\">echo<\/span> Nome_classe<span style=\"color: #339933;\">::<\/span><span style=\"color: #004000;\">STATO<\/span><span style=\"color: #339933;\">;<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>Per completezza, concludiamo dicendo che esiste anche una forma di <strong>metodi che vengono richiamati allo stesso modo delle costanti: i &#8220;metodi statici&#8221;<\/strong>.<br \/>\nPerch\u00e9 usarli? A differenza delle costanti viste sopra, i valori di questi metodi statici possono essere modificati come nei metodi comuni.<br \/>\nAll&#8217;interno di questi metodi non \u00e8 possibile usare $this. Un metodo statico si crea con la clausola &#8220;static&#8221;. Per esempio:<\/p>\n<div class=\"wp_syntax\">\n<table>\n<tbody>\n<tr>\n<td class=\"line_numbers\">\n<pre>1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n10\r\n11\r\n12\r\n13\r\n14\r\n15\r\n16<\/pre>\n<\/td>\n<td class=\"code\">\n<pre class=\"php\" style=\"font-family: monospace;\"><span style=\"color: #000000; font-weight: bold;\">class<\/span> Nome_classe<span style=\"color: #009900;\">{<\/span>\r\n\r\n\t<span style=\"color: #009900;\">[<\/span><span style=\"color: #339933;\">...<\/span><span style=\"color: #009900;\">]<\/span>\r\n\r\n\tstatic <span style=\"color: #000000; font-weight: bold;\">function<\/span> metodo4<span style=\"color: #009900;\">(<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #009900;\">{<\/span>\r\n\t\t<span style=\"color: #b1b100;\">echo<\/span> <span style=\"color: #0000ff;\">\"prova\"<\/span><span style=\"color: #339933;\">;<\/span>\r\n\t<span style=\"color: #009900;\">}<\/span>\r\n\r\n\t<span style=\"color: #000000; font-weight: bold;\">function<\/span> metodo5<span style=\"color: #009900;\">(<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #009900;\">{<\/span>\r\n\t\t<span style=\"color: #000000; font-weight: bold;\">self<\/span><span style=\"color: #339933;\">::<\/span><span style=\"color: #004000;\">metodo4<\/span><span style=\"color: #009900;\">(<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #339933;\">;<\/span>\r\n\t<span style=\"color: #009900;\">}<\/span>\r\n\r\n<span style=\"color: #009900;\">}<\/span>\r\n\r\n<span style=\"color: #000088;\">$istanza<\/span><span style=\"color: #339933;\">=<\/span><span style=\"color: #000000; font-weight: bold;\">new<\/span> Nome_classe<span style=\"color: #009900;\">(<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #339933;\">;<\/span>\r\nNome_classe<span style=\"color: #339933;\">::<\/span><span style=\"color: #004000;\">metodo4<\/span><span style=\"color: #009900;\">(<\/span><span style=\"color: #009900;\">)<\/span><span style=\"color: #339933;\">;<\/span><\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>Come vedete, all&#8217;esterno della classe \u00e8 buona norma richiamare il metodo come con le costanti. A dire la verit\u00e0 funziona anche l&#8217;uso del solito operatore di deferenziamento (-&gt;), ma \u00e8 una pratica sconsigliata.<\/p>\n<div style=\"margin-top: 100px; margin-bottom: 20px;\"><strong><em>Copyright immagini<\/em><\/strong><\/div>\n<p>(1) http:\/\/www.lettera43.it\/foto\/ibm-un-chip-che-simula-il-cervello_4367573473.htm<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Un tutorial per iniziare a programmare a oggetti con il php. Definizione, funzionamento delle classi, uso dei metodi, attributi, costanti e metodi statici.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[78],"tags":[4,77,46],"class_list":["post-1739","post","type-post","status-publish","format-standard","hentry","category-php-mysql","tag-php","tag-programmazione-oggetti","tag-tutorial","cat-78-id"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/posts\/1739"}],"collection":[{"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/comments?post=1739"}],"version-history":[{"count":11,"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/posts\/1739\/revisions"}],"predecessor-version":[{"id":1750,"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/posts\/1739\/revisions\/1750"}],"wp:attachment":[{"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/media?parent=1739"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/categories?post=1739"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.manuelmarangoni.it\/sir-bit\/wp-json\/wp\/v2\/tags?post=1739"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}