Riga 7-8:
In queste 2 righe di codice è racchiunsa un'informazione molto importante: come potete notare, abbiamo fatto riferimento alle varibili $specie ed $ambiente (che erano variabili di istanza, ma anche se fossero state varibili di classe non avrebbe fatto differenza) in modo un po particolare:Codice PHP:$this->specie = $specie;
$this->ambiente = $ambiente;
D'ora in poi, infilatevi bene in testa che l'unico modo per riferirsi ad una variabile di classe o di istanza , e quindi l'unico modo di modificare un oggetto, è quello di anteporre al nome della variabile senza $ il prefisso $this->. Il significato di -> ve lo spiegherò più avanti. per ora vi basti sapere questo. oltretutto è fondamentale sapere che $this-> va anteposto anche a nomi di funzioni definite all'interno della classe stessa, in caso volessimo utilizzarle da un'altra parte, sempre nella stessa classe. L'uso di $this si limita a dire a PHP di riferirsi alla variabile di QUESTA (this) classe, non ad un'altra variabile presente nel blocco di codice. Quindi scrivere:codice:$this->nome_var_senza_simbolo_dollaro
è perfettamente lecito. Infatti questo comando assegna il valore della variabile locale $variabile, alla variabile di classe o di istanza omonima.Codice PHP:$this->variabile = $variabile;
Senza proseguire riga per riga vi spiego altri punti fondamentali:
Riga 21-35:
Questo è un'esempio di classe estesa. A parte farvi vedere la sintassi, mi interessava farvi notare che, all'interno del costruttore della sottoclasse, abbiamo una chiamata al costruttore della superclasse. Questo è obbligatorio se nella sottoclasse abbiamo un costruttore, altrimenti l'ereditarietà non avrebbe effetto alcuno sulla sottoclasse. In caso non si abbia un costruttore, consiglio comunque caldamente di inserirlo solo per richiamare il costruttore della superclasse: infatti,nel primo caso (no costruttore), un'istanza della classe figlio sarebbe considerata un'istanza della classe padre, mentre nel secondo caso (si costruttori) otterresti due ID differenti.Codice PHP:class animale extends essereVivente{
var $peso;
var $altezza;
var $gasRespirato = "ossigeno";
var $arti;
function animale($specie,$ambiente,$peso,$altezza,$arti){
$this->essereVivente($specie,$ambiente);
$this->specie = $specie;
$this->peso = $peso;
$this->altezza = $altezza;
$this->arti = $arti;
echo "Sono nato!!";
}
Riga 87-89:
Da queste righe dovreste notare una cosa: guida() è una funzione definita ANCHE nella superclasse della classe in cui si trova (la classe donna). Qui vi è una seconda definizione. Darà un errore??Fate una prova, e poi uardate il risultato. Non da errore: difatti l'operazione di definire metodi con nome identico a metodi della superclasse è chiamato ridefinizione, e permette di cambiare il comportamento di un metodo in base all'oggetto dal quale è stato creato. In questo caso una chiamata a guida() stamperebbe "3 morti e 15 feriti", e non "Segno della croce e via!!Anche se non ho ancora preso la patente!", come era stato definito nella superclasse essereUmano.Codice PHP:function guida(){
echo "3 morti e 15 feriti...";
}
Siccome la teoria è stata lunga, due accenni alla pratica:
Di seguito, vi spiegherò come ristanziare una classe e come lavorarci. Il tutto è molto semplice, anche se andrebbero fatte delle precisazione sulla creazione di istanze per riferimento che m risparmierò perchè vanno fuori dal contesto della pillola . Una classe si istanzia nel seguente modo:
nel caso pratico:codice:nome_variabile = new nome_classe[(arg1,...,argN)];
Come vedete non c'è nulla di complesso a parte una cosa che potrebbe risultare poco chiara: nel caso in cui la classe da istanziare NON abbia costruttore, le parentesi tonde possono essere inserite vuote (senza parametri attuali), o possono essere ommesse. Questione di stile. Io consiglio la seconda.Codice PHP:$miaNonna = new donna("Isabella","campagna","1.60","dialetto milanese");
Per fare riferimento alla variabili di una classe o ai suoi metodi, useremmo la seguente struttura:
Come potete notare, la chiamata ad un metodo necessita dell'utilizzo delle parentesi tonde, che non possono essere ommesse. Nel nosto caso particolare avremmo:codice:nome_istanza->nome_variabile; nome_istanza->nome_metodo([arg1,...,argN]);
Il tutto non mi sembra affatto complesso...dateci un'occhiata e capirete subito come utilizzare il simbolo ->. Una precisazione: in caso una variabile di classe (o istanza) contenga un'istanza di un'altro oggetto, per riferirci alle varibili o metodi di quest'ultimo faremo:Codice PHP://facciamo guidare mia nonna!!
$miaNonna->guida();
//Stampiamo il suo peso:
echo $miaNonna->peso;
Naturalmente il tutto può essere nidificato, ed utilizzato anche all'interno della classe usando $this al posto del nome della prima istanza.codice:istanza_1->var_contente_istanza2->metodo_o_var_di_istanza2
Se si vole fare riferimento ad un metodo di una classe che non è ancora stata istanziata, seguite la sintassi seguente:
Un esempio con la nostra classe non ha molto senso, comunque dovreste aver capito correttamente come funziona il tutto. Chiarimenti, se neccessari, li aggiungerò in seguito. NON potete accedere alle variabili usando il costrutto con "::".codice:nome_classe::nome_metodo([arg1, ... ,argN])
Semi-concludo spiegandovi l'uso di parent:
serve per permettere, all'interno della definizione di una classe, di riferirsi a metodi dalla superclasse direttamente, senza che questa sia stata istanziata nel costruttore. Usare parent:: è un caloroso consiglio ma non un obbligo: infatti potete riferirvi direttamente ai metodi della superclasse con nome_super_classe::metodo.codice:parent::nome_metodo([arg1, ..., arg2])
Consiglio caldamente tutti coloro che fossero interessati ad iniziare a darci sotto con la OOP in PHP di scaricarsi PHP-GTK e fare delle prove con lui: qui sarete obbligati ad usarle, ed iparerete a smanettarci un po. Vi allego una piccola classe PHP-GTK di esempio con esecuzione compresa. Riuscite a commentarmela correttamente line-by-line (i neofiti naturalmente, NON i secchioni...) ??
Prima di chiudere ricordo che, nella programmazione ad oggetti, è fondamentale svolgere il lavoro nel modo più ordinato possibile. Strutturate bene prima il tutto (io uso UML...ma va bene anche un foglio di carta...magari non igenica, che se piove sparisce...), poi cominciate a scrivere le classe. Dovete partire da un'idea per scrivere qualcosa di ideale dal quale tirare fuori i vostri oggetti. E finchè le idee sono in testa, è come nascondere dei soldi nel buco del cesso di un aereoporto in Kenia...Codice PHP:<?php
class GtkApplication{
var $os;
var $mainWindow;
function GtkApplication(){
if(!class_exists('gtk')){
$this->os = PHP_OS;
if(strstr(strtoupper($this->os),'WIN')){
dl('php_gtk.dll');
}else{
dl('php_gtk.so');
}
}
}
function setMainWindow($mainWindow = false){
if(!$mainWindow){
print 'You must specify a valid GtkWindow istance as setMainWindow argument';
return false;
}else{
$this->mainWindow = $mainWindow;
return true;
}
}
function deleteEvent(){
//print 'Event deleted';
return false;
}
function destroy(){
//print 'Exit';
Gtk::main_quit();
return true;
}
function mainLoop(){
$this->mainWindow->connect('destroy',array($this,'destroy'));
$this->mainWindow->connect('delete-event',array($this,'deleteEvent'));
$this->mainWindow->show_all();
Gtk::main();
}
}
/*TEST*/
//YOU MUST ISTANCE GtkApplication AFTER istancing or extending from Gtk* classes
$myApp = new GtkApplication();
class mainWin extends GtkWindow{
function mainWin($name = '',$border = 10,$dimensions = false,$pos = GTK_WIN_POS_CENTER){
$this->GtkWindow();
$this->set_border_width($border);
$this->set_title($name);
$this->set_position($pos);
if($dimensions){
$this->set_usize($dimensions[0],$dimensions[1]);
}
}
}
$main = new mainWin('prova');
$myApp->setMainWindow($main);
$myApp->mainLoop();
?>
è tardi: le malboro si fanno sentire, il sonno pure...domani altro giorno altra corsa...si va all'università e si va al lavoro...si mangia e si sco*a...vabbo. Spero sia servita qualcuno questa pillola. Se non vi è servita, fa niente.
Un grazie a Saibal che oggi pome mi ha fatto pisciare addosso dal ridere leggendo le stronzate della sezione Amacord del suo sito...
'notte e buona lettura
P.s: siccome è possibile che mi sia dimenticato qualcosa, fatemelo sapere e provvederò ad editare.Ci sono un po di fUnzioni interessanti relative alle classi, magari ve ne parlerò in seguito.

Rispondi quotando