View Full Version : [PHP] Domandina sull'uso della keyword $this
e-commerce84
08-11-2009, 11:42
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
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
Perché non potresti accedere a quelle private e protette al di fuori dell'istanza di classe... per questo motivo ti dicono che $this lo utilizzi per accedere a istanze pubbliche.
e-commerce84
08-11-2009, 11:54
Perché non potresti accedere a quelle private e protette al di fuori dell'istanza di classe... per questo motivo ti dicono che $this lo utilizzi per accedere a istanze pubbliche.
Ok...ma fammi capire...
Se io voglio accedere ad una variabile privata all'interno della classe stessa posso farlo, giusto?
Esempio:
<?php
class MyClass{
private $a = "Ciao";
public function stampa(){
echo $this->a;
}
}
?>
Dovrebbe funzionare giusto?
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
Si, è esattamente come dici. Penso che il passo della guida che citi sia errato o scritto male!
Si, è esattamente come dici. Penso che il passo della guida che citi sia errato o scritto male!
Concordo.
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).
e-commerce84
08-11-2009, 12:26
Concordo.
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).
Ok...allora è come avevo capito...mo tocca fa girare i miei esempietti ahaha
Ok...ma fammi capire...
Se io voglio accedere ad una variabile privata all'interno della classe stessa posso farlo, giusto?
Esempio:
<?php
class MyClass{
private $a = "Ciao";
public function stampa(){
echo $this->a;
}
}
?>
Dovrebbe funzionare giusto?
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
Scusa ma fare una prova invece di chiedere? Una prova del genere quanto tempo prende...20 secondi a dir tanto?
Scusa ma fare una prova invece di chiedere? Una prova del genere quanto tempo prende...20 secondi a dir tanto?
Di meno, però penso che l'utente volesse una raccomandazione teorica sul problema.
e-commerce84
08-11-2009, 13:36
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...
<?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;
?>
Praticamente ho un costruttore che riceve un array come parametro e lo copia nel mio array di istanza chiamato heap.
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
Devi usare il $this per accedere alla variabile $heapSize.
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'
}
Qui $heapSize ha visibilità solo nel costruttore, non è la tua variabile privata.
e-commerce84
08-11-2009, 13:51
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?
Esatto, dici che vieni da java, allora è come java solo che è obbligatorio.
Dove in java puoi accedere con this, qui DEVI accedere con this.
e-commerce84
08-11-2009, 13:55
Esatto, dici che vieni da java, allora è come java solo che è obbligatorio.
Dove in java puoi accedere con this, qui DEVI accedere con this.
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 !!!
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 !!!
hehe succede, prenditi una pausa magari che il tuo lavoro ne gioverà di sicuro.
In questi casi si perde più tempo su errori banali che altro.
Esatto, dici che vieni da java, allora è come java solo che è obbligatorio.
Dove in java puoi accedere con this, qui DEVI accedere con this.
Esatto... forse PHP è piu chiaro e meno ambiguo sotto questo aspetto!
e-commerce84
08-11-2009, 14:06
Esatto... forse PHP è piu chiaro e meno ambiguo sotto questo aspetto!
hehe si...poi però venendo da Java rimani sconvolto dal poter assegnare ad una variabile prima una stringa,poi un array e poi un int hehe :D
hehe si...poi però venendo da Java rimani sconvolto dal poter assegnare ad una variabile prima una stringa,poi un array e poi un int hehe :D
Eh si Java è fortemente tipizzato, PHP direi un pò meno :D
Ma sono i pro e contro dei linguaggi a tipizzazione dinamica :)
Se vuoi rimanere veramente sconvolto in quel senso dovresti provare javascript allora :D
Se vuoi rimanere veramente sconvolto in quel senso dovresti provare javascript allora :D
CONCORDO! :D :D
e-commerce84
08-11-2009, 14:52
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:
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);
}
Mi visualizza: Array ( [1] => 80 [2] => 70 [3] => 90 )
Simpatica questa cosa...può essere decisamente prativa :-)
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:
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);
}
Mi visualizza: Array ( [1] => 80 [2] => 70 [3] => 90 )
Simpatica questa cosa...può essere decisamente prativa :-)
In realtà è un Bug dell'engine PHP...
Scherzo :D
Si è una peculiarità di PHP!
e-commerce84
08-11-2009, 15:08
Lascia stare che all'inizio prima di fargli stampare l'array quando ho visto che in tutti e due i casi c'erano 3 elementi ho sbiancato (perchè pensavo che partisse da 0 quindi ce ne sarebbero dovuti essere 4 hehe)
Altra domandina (sempre sui maledetterrimi $this....)
Se dentro la variabile di istanza heap ci devo mettere il valore restituito dalla funzione ricorsiva heapify() (che come parametri prende un array ed un indice) a cui passo proprio la variabile di istanza $heap e l'indice 1 (spero di esser stato chiaro), come devo fare:
Così:
$this->heap = $this->heapify($heap, 1);
o così:
$this->heap = $this->heapify($this->heap, 1);
Secondo me la seconda...ma non si sà mai (nel vecchio codice c'era la prima...dubbio amletico)
Grazie
Lascia stare che all'inizio prima di fargli stampare l'array quando ho visto che in tutti e due i casi c'erano 3 elementi ho sbiancato (perchè pensavo che partisse da 0 quindi ce ne sarebbero dovuti essere 4 hehe)
Altra domandina (sempre sui maledetterrimi $this....)
Se dentro la variabile di istanza heap ci devo mettere il valore restituito dalla funzione ricorsiva heapify() (che come parametri prende un array ed un indice) a cui passo proprio la variabile di istanza $heap e l'indice 1 (spero di esser stato chiaro), come devo fare:
Così:
$this->heap = $this->heapify($heap, 1);
o così:
$this->heap = $this->heapify($this->heap, 1);
Secondo me la seconda...ma non si sà mai (nel vecchio codice c'era la prima...dubbio amletico)
Grazie
Mmm...
Se tratti $heap come attributo, passi solo $heap...
Ma guardando il tuo codice direi la seconda, quindi:
$this->heap = $this->heapify($this->heap, 1);
e-commerce84
08-11-2009, 15:24
Mmm...
Se tratti $heap come attributo, passi solo $heap...
Ma guardando il tuo codice direi la seconda, quindi:
$this->heap = $this->heapify($this->heap, 1);
che intendi se tratto $heap solo come attributo? Io alla funzione gli devo passare come parametro la variabile di istanza $heap dell'oggetto che stà per creando
Il codice del costruttore è questo:
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
echo "Heap inizializzato con i valori dell'array parametro, contenuto heap: ";
print_r($this->heap);
/* Invoca il metodo heapify() sull'array heap partendo dalla prima posizione che sarà così trasformato in un HEAP a tutti gli effeti */
$this->heap = $this->heapify($this->heap, 1);
}
Secondo me dovrebbe essere giusto...spero
Scusa se ti stresso...sei gentilissimo :)
che intendi se tratto $heap solo come attributo? Io alla funzione gli devo passare come parametro la variabile di istanza $heap dell'oggetto che stà per creando
Il codice del costruttore è questo:
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
echo "Heap inizializzato con i valori dell'array parametro, contenuto heap: ";
print_r($this->heap);
/* Invoca il metodo heapify() sull'array heap partendo dalla prima posizione che sarà così trasformato in un HEAP a tutti gli effeti */
$this->heap = $this->heapify($this->heap, 1);
}
Secondo me dovrebbe essere giusto...spero
Scusa se ti stresso...sei gentilissimo :)
Ok, allora gli passi il this->variabile :)
Vai tranquillo, il FORUM nasce per questo! :cool:
_Claudio
08-11-2009, 16:42
Ma comprare un libro sull'argomento?
Le guide che si trovano online (nonostante quelle di html.it siano delle buone referenze) lasciano sempre un po' a desiderare.
Piuttosto un libro di buon livello può essere efficace per risolvere questi dubbi.
e-commerce84
08-11-2009, 17:24
Ma comprare un libro sull'argomento?
Le guide che si trovano online (nonostante quelle di html.it siano delle buone referenze) lasciano sempre un po' a desiderare.
Piuttosto un libro di buon livello può essere efficace per risolvere questi dubbi.
Sicuramente lo prenderò...anche perchè sono un amante della carta ed odio cecarmi a leggere su monitor...però avendo iniziato l'altro ieri a dare un'occhiata a PHP OO ancora n on ce l'ho...
_Claudio
09-11-2009, 18:40
Sicuramente lo prenderò...anche perchè sono un amante della carta ed odio cecarmi a leggere su monitor...però avendo iniziato l'altro ieri a dare un'occhiata a PHP OO ancora n on ce l'ho...
Personalmente posso dirti che PHP ad oggetti con la sua tipizzazione dinamica, al pari di javascript... è un obrobrio.
Con la differenza che js è un linguaggio "frivolo", se si patcha in qualche modo non fa niente visto che non è centrale nel funzionamento del sistema informativo, il massimo che fa è la validazione dati, che con piccoli accorgimenti può essere replicata per sicurezza lato server senza inficiare le prestazioni.
PHP se rimaneva procedurale per come è nato sicuramente avrebbe mostrato maggiore serietà, ci sto lavorando proprio in questi giorni (con PHP-OO) perchè volenti o dolenti i servizi hosting forniscono sempre e solo PHP, mentre JSP/servlet è raro e caro, ma estremamente migliore.
Mi piacerebbe anche studiare la sua implementazione a basso livello, non mi stupirei se trovassi buchi e bachi a non finire... e se il linguaggio è buggato... le conseguenze sono ovvie.
Personalmente posso dirti che PHP ad oggetti con la sua tipizzazione dinamica, al pari di javascript... è un obrobrio.
Con la differenza che js è un linguaggio "frivolo", se si patcha in qualche modo non fa niente visto che non è centrale nel funzionamento del sistema informativo, il massimo che fa è la validazione dati, che con piccoli accorgimenti può essere replicata per sicurezza lato server senza inficiare le prestazioni.
PHP se rimaneva procedurale per come è nato sicuramente avrebbe mostrato maggiore serietà, ci sto lavorando proprio in questi giorni (con PHP-OO) perchè volenti o dolenti i servizi hosting forniscono sempre e solo PHP, mentre JSP/servlet è raro e caro, ma estremamente migliore.
Mi piacerebbe anche studiare la sua implementazione a basso livello, non mi stupirei se trovassi buchi e bachi a non finire... e se il linguaggio è buggato... le conseguenze sono ovvie.
C'è di peggio...
_Claudio
09-11-2009, 19:00
C'è di peggio...
Lo so... python ad esempio...
:D :D :D adesso arriva CDI e mi inforca...
Lo so... python ad esempio...
:D :D :D adesso arriva CDI e mi inforca...
Esatto :D
No intendevo Perl :D :D
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.