Newsgroup: it.comp.www.php
Titolo: private, public ecc per fare?

Ciao,
la mia conoscenza di php è limitata, e, leggendo sulla programmazione OO 
e su php5, mi sono imbattuto nelle proprietà public e private delle 
funzioni e delle variabili all'interno delle classi. Non ho capito l'uso 
pratico di tale distinzione. Public rende una variabile visibile al di 
fuori della funzione... ma perché renderla pubblica o privata? Per 
impedirne l'uso a uno sviluppatore malintenzionato? Non è sarcasmo, mi è 
venuto in mente quello!! :)
Se uno vuole usare una classe, gli si dicono quali funzioni deve 
utilizzare, e finisce lì, no? Perché uno dovrebbe andare a usarne di non 
utili?
ciao!
m.

 quello!! :)
E' proprio così...
Non conosco nello specifico la programmazione a oggetti con php 5, ma uno 
dei princìpi fondamentali della programmazione a oggetti è l'information 
hiding: nascondere agli utenti di una classe tutte le informazioni che non 
sono necessarie al suo utilizzo, e possono anzi consentirne un uso 
improprio.

 improprio.
Come mai, non è possibile studiarsi la classe, e andare a cercare tutti 
i private e protected? Oppure si può fare un mostra_metodi(classe) da 
linea di comando, e l'interprete mostra tutte le funzioni public? (mi 
pare che con python ci sia una cosa simile).

 con python ci sia una cosa simile).
Per il caso specifico di php non ti so dire, magari qualcuno č piů esperto 
di me.
In java, ad esempio, esiste una sorta di "compilatore" che parserizza i 
sorgenti, raccoglie i nomi dei campi e dei metodi e genera i file html della 
documentazione. Ignorando, se ben ricordo, tutti gli elementi "private". In 
questo modo, ad esempio, tu puoi vendere i tuoi file compilati con la 
documentazione html, senza far sapere all'acquirente in che modo i metodo 
sono stati implementati, come lavorano, su quali dati si appoggiano...

 pare che con python ci sia una cosa simile).
Si, ma l'importante è che tu non possa accedervi. Purtoppo python ha
come grosso limite proprio la sicurezza, percui il fatto che non dia la
possibilità ad un programmatore di impedire l'uso di una funzione
all'esterno di una classe crea seri problemi.
Ma non è solo un discorso di sicurezza. Il negare l'accesso a tutto
ciò che non è indispensabile serve a poter prevedere  (obbligare)
come tale classe verrà utilizzata e facilitare eventuali modifiche.
Sarebbe buona pratica, ad esempio, settare tutti i parametri come
privati e prevedere delle funzioni di accesso.
Questo può essere utile, ad esempio, per impedire che una variabile
sia modificata. Oppure per poter cambiare la logica.
 Cerco di spiegarmi meglio.
Poni di avere una classe del tipo:
class Persona {
   private $nome = "", $cognome = "", $anni = 0;
   public function getAnni() {
     return $this->anni;
   }
}
A te, in un certo punto del programma, serve solo sapere gli anni di
una persona, quindi accederai all'oggetto relativo nel modo:
$persona->getAnni();
Un giorno ti accorgi però che la tua implementazione crea problemi
perché devi prevedere l'aggiornamento della variabile $anni. Quindi
decidi di cambiare con una classe del tipo:
class Persona {
    private $nome = "", $cognome = "", $dataDiNascita;
    public function getAnni(
       return anno( $dataOdierna - $dataDiNascita );
    )
}
In tutto il programma, dove usi $persona->getAnno(), non dovrai
modificare nulla. Gli unici punti dove dovrai modificare il codice è
dove setti l'anno.
Se tu, invece, avessi usato delle variabili public utilizzate
direttamente avresti dovuto modificare l'intero programma in tutti i
punti dove vai a richiamare $persona->anno. In genere è un lavoro
molto più oneroso.
Questo esempio è molto semplice, ma è tanto per darti un'idea. Ci
sono situazioni certamente moto più complesse. In generale è bene
evitare che un progammatore possa usare un oggetto dando per scontato
che la logica al suo interno funzioni in un certo modo. E questo,
spesso, è possibile solo settando a private variabili e funzioni.
Mattia