|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Feb 2009
Messaggi: 700
|
[PHP] Domandina sull'uso della keyword $this
Ciao,
in questi giorni stò studiandomi PHP OO, vengo da Java... Da quello che mi ricordo in Java il this lo si usa per indicare che ci si stà riferendo ad una variabile di istanza dell'oggetto che si stà usando in quel momento. In Java mettere this davanti alla variabile di istanza è facoltativo...se non lo si mette ci si riferisce automaticamente a quella...mi sembra di capire che in PHP non sia così, giusto? L'altra cosa che mi ha confuso le idee è stato leggere sulla guida di HTML.it a PHP OO (quì: http://php.html.it/guide/lezione/41...la-classe-this/) la seguente frase: "Questo è un concetto di fondamentale importanza, che ci permette di accedere alle varie componenti (pubbliche) della classe direttamente dal suo interno." Cosa mi sta dicendo? che posso usare $this solo davanti a variabili di istanza dichiarate come public ?!?! In Java non è affatto così...anzi da quel poco che sò di programmazione OO la professoressa ci ha spaccato la testa che le variabili di istanza devono sempre essere dichiarate private per nascondere l'implementazione all'utente che poi userà la classe (information hiding) e che l'utente dovrà poter operare con la classe solamente attraverso la sua interfaccia (l'insieme dei metodi public) Come mai quì mi dice che posso usare $this solo davanti alle variabili di istanza pubbliche ?!?! Mi sembra un po' un controsenso... Grazie a tutti |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Apr 2008
Città: Varese
Messaggi: 406
|
Quote:
__________________
IT Developer at Hardware Upgrade S.r.l. self.love(this.me()); |
|
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Feb 2009
Messaggi: 700
|
Quote:
Se io voglio accedere ad una variabile privata all'interno della classe stessa posso farlo, giusto? Esempio: Codice:
<?php class MyClass{ private $a = "Ciao"; public function stampa(){ echo $this->a; } } ?> La variabile $a è privata e non voglio far sapere all'utente che usa la mia classe com'è implementata...gli fornisco solo un metodo pubblico (l'interfaccia della mia classe) che stampa il contenuto di $a L'utente può usare il metodo publico stampa() e tale metodo può stampare il contenuto della variabile $a perchè è interno alla mia classe In Java è così...in PHP? Grazie Ultima modifica di e-commerce84 : 08-11-2009 alle 10:56. |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 558
|
Si, è esattamente come dici. Penso che il passo della guida che citi sia errato o scritto male!
|
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Apr 2008
Città: Varese
Messaggi: 406
|
Quote:
Per ecomm84 si, se tu vuoi accedere ad un qualsiasi metodo, tipo di dato, ecc... interno alla classe, che sia privato, protetto o public si usa l'operatore $this->. Se vuoi accedere esternamente, puoi farlo solo per metodi pubblici e (privati qualora la classe fosse astratta ed ereditata); se è protetto non ci accedi dall'esterno della classe. ![]() In Java non esiste il this o meglio, si omette senza problemi (infatti è una cosa molto comoda ma poco chiara e abbastanza ambigua).
__________________
IT Developer at Hardware Upgrade S.r.l. self.love(this.me()); |
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Feb 2009
Messaggi: 700
|
Quote:
|
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
Quote:
|
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Apr 2008
Città: Varese
Messaggi: 406
|
Di meno, però penso che l'utente volesse una raccomandazione teorica sul problema.
__________________
IT Developer at Hardware Upgrade S.r.l. self.love(this.me()); |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Feb 2009
Messaggi: 700
|
Diciamo che volevo una cosa teorica perchè stò impazzendo !!!
Nell'esempio banale avevo provato ed infatti funziona... Quì invece NON FUNZIONA PIU' !!! Ci sarà qualche altro genere di problema che non capisco... Codice:
<?php error_reporting(E_ALL); ini_set('display_errors', 1); /* Classe che implementa la struttura dati HEAP e la sua funzionalità per l'ordinamento di una collezione mediante l'algoritmo di ordinamento Heap Sort */ class Heap{ /* Variabile di istanza che implementa la struttura dati ad albero dell'heap per mezzo di un array */ private $heap = array(); private $heapSize; // Variabile di istanza che conterrà la dimensione dell'heap /* COSTRUTTORE: Copia l'array parametro nella variabile di istanza heap e mette dentro la variabile di istanza heapSize la sua dimensione */ public function __construct($arr){ $heapSize = count($arr); // Mette dentro heapSize la dimensione dell'array parametro' $this->heap = $arr; // Copia l'array parametro nella variabile di istanza heap' } public function getDimensione(){ return $this->heapSize; // Restituisce al chiamante il valore contenuto in heapSize } } $array = array(80, 70, 90); $myHeap = new Heap($array); $dimensione = $myHeap->getDimensione(); echo "La dimensione dell'heap è: ". $dimensione; ?> Poi mette la dimensione dell'array parametro nell'altra variabile di istanza chiamata heapSize. L'oggetto così dovrebbe essere creato. Poi nella classe metto un metodo pubblico per la mia interfaccia chiamato getDimensione che dovrebbe restituire al chiamante il valore contenuto nella variabile di istanza privata heapSize... Provato...ma non lo fà...non mi restituisce nulla...credo che alcuni dei problemi di ieri dipendessero anche da problemi analoghi...ora stò tentando di rompermi la testa per capire bene su cose più piccole...please help me Come mai? Grazie |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
Devi usare il $this per accedere alla variabile $heapSize.
Codice PHP:
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Feb 2009
Messaggi: 700
|
O... risolto
Cmq ultimo dubio...$this lo uso solamente per accedere alle variabili di istanza (da dentro alla classe) o ai metodi privati della classe? Giusto? |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
Esatto, dici che vieni da java, allora è come java solo che è obbligatorio.
Dove in java puoi accedere con this, qui DEVI accedere con this. |
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Feb 2009
Messaggi: 700
|
Si cmq stò fuori di testa...sarà che ho passato troppe ore davanti al PC tra ieri ed oggi...in Java anche se non è obbligatorio i this li mettevo sempre per motivi di chiarezza...in PHP me li dimentico SEMPRE !!!
|
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
Quote:
In questi casi si perde più tempo su errori banali che altro. |
|
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Apr 2008
Città: Varese
Messaggi: 406
|
Esatto... forse PHP è piu chiaro e meno ambiguo sotto questo aspetto!
__________________
IT Developer at Hardware Upgrade S.r.l. self.love(this.me()); |
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Feb 2009
Messaggi: 700
|
|
![]() |
![]() |
![]() |
#17 | |
Senior Member
Iscritto dal: Apr 2008
Città: Varese
Messaggi: 406
|
Quote:
![]() Ma sono i pro e contro dei linguaggi a tipizzazione dinamica ![]()
__________________
IT Developer at Hardware Upgrade S.r.l. self.love(this.me()); |
|
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Dec 2002
Messaggi: 3359
|
Se vuoi rimanere veramente sconvolto in quel senso dovresti provare javascript allora
![]() |
![]() |
![]() |
![]() |
#19 | |
Senior Member
Iscritto dal: Apr 2008
Città: Varese
Messaggi: 406
|
Quote:
![]() ![]()
__________________
IT Developer at Hardware Upgrade S.r.l. self.love(this.me()); |
|
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: Feb 2009
Messaggi: 700
|
hehe notavo ora una cosa carina degli array in PHP (francamente non me l'aspettavo...in C ed in Java non è così e te lo devi gestire a mano tali situazioni).
Se io inizializzo un array a partire dalla cella di indice 1 e non dalla cella di indice 0...lui l'array lo vede sempre di 3 locazioni...tranne che mi sembra di capire che considera la locazione 1 come la prima (invece della 0 come in C o in Java che sarebbe stata lasciata "vuota"...anzi in C ci sarebbe proprio il contenuto di ciò che c'era prima in memoria...con rischi di bei casini...) Se come costruttore uso: Codice:
public function __construct($arr){ for($i=0; $i<count($arr); $i++) $this->heap[$i+1] = $arr[$i]; $this->heapSize = count($this->heap);// Mette dentro heapSize la dimensione dell'array parametro print_r($this->heap); } Simpatica questa cosa...può essere decisamente prativa :-) |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:58.