Warning: ambito di visibilità publica delle classi? Encapsulation e sicurezza, metodi getter e setter

web developer umbriaArticoli precedenti sullo stesso tema OOP in PHP:

  1. https://umbriawayinfo.wordpress.com/2019/04/07/programmazione-procedurale-oppure-oop-this-is-the-problem/
  2. https://umbriawaypotenzia.wordpress.com/2019/04/07/php-versione-sette-introdotte-nuove-direttive-per-trasformare-il-linguaggio-in-fortemente-tipicizzato/
  3. https://umbriawaysemplifica.wordpress.com/2019/04/08/ambito-di-visibilita-delle-variabili-in-php-public-protected-private/
  4. https://umbriawaytarget.wordpress.com/2019/04/08/php-oop-magic-method-e-costruttori/

Una classe ben scritta deve rispettare certe regole di sicurezza, ci siamo chiesti ad esempio se una variabile qta che sta per quantità dopo che ne abbiamo fatto un uso massivo nel nostro programma possa essere modificata dal ns capo progetto che per necessità contingenti decide di ribattezzare la proprietà come quantità per esteso? L’ambito di visibilità delle proprietà e dei metodi va pianificata a tavolino, l’oggetto creato deve essere protetto il più possibile trasformando tutte le proprietà e i metodi definiti come PUBLIC come private o protected. Private non dà accesso alle classi derivate ma con Protected ha in comune l’accessibilità solo dall’ interno. Diamo un occhiata a un esempio di vulnerabilità PUBLIC

/*
<?php
class Libro {
public $titolo;
public $autore;
public $codiceisbn;
public $prezzo;
public $qta;
public function __construct($tit,$aut,$cod,$qta=1) {
$this-> titolo = $tit;
$this-> autore = $aut;
$this-> codiceisbn = $cod;
$this-> qta = $qta;
}
public function getTitolo() {
return $this->titolo;
}
public function getQta() {
return $this->qta;
}
public function addQta($copie) {
$this->qta += $copie;
}
public function getIsbn() {
return $this->codiceisbn;
}
public function setIsbn($isbn) {
$this->codiceisbn = $isbn;
}
public function setPrezzo($prezzo) {
$this->prezzo = $prezzo;
}
public function inPrestito($cod,$qta) {
$this->qta -= $qta;
}
}

e il file di lettura index.php

<?php
require_once “classi/Libro.php”;

function __autoload($classi) {
$filename = __DIR__ . ‘/classi/’ . $classi . ‘.php’;
require_once $filename;
}

$prezzo = 19.99;
$isbn = ‘UHJUI899’;
$nlibro = new Libro(‘Sandokan’,’Salgari’, $isbn, 5);
$ncliente = new Cliente(‘Andrea’,’Rossi’, ‘a.rossi@gmail.com’, $nlibro);

*/

vediamo ora come possiamo dare più sicurezza alla nostra classe LIBRO proteggendo le parti PUBLIC che ci interessano per trasformarle in PRIVATE o PROTECTED, in questo caso quantità, qta che non potrà essere settata dall’ esterno:

/*
<?php
class Libro1 {
protected $titolo;
protected $autore;
protected $codiceisbn;
protected $prezzo;
protected $qta;
public function __construct($tit,$aut,$cod,$qta=1) {
$this-> titolo = $tit;
$this-> autore = $aut;
$this-> codiceisbn = $cod;
$this-> qta = $qta;
}
public function getTitolo() {
return $this->titolo;
}
public function setIsbn($isbn) {
$this->codiceisbn = $isbn;
}
public function getIsbn() {
return $this->codiceisbn;
}
public function getQta() {
return $this->qta;
}
public function addQta($quantita) {
$this->qta += $quantita;
}
public function setPrezzo($prezzo) {
$this->prezzo = $prezzo;
}
public function inPrestito($cod,$qta) {
$this->qta -= $qta;
}
}

il file di lettura index1.php

<?php
require_once “classi/Libro1.php”;

$nlibro = new Libro1(‘Sandokan’,’Salgari’, ‘1234ASB’);
//var_dump($nlibro);
echo $nlibro->getTitolo();
$nlibro->qta = 10;
$nlibro->addQta(9);
echo $nlibro->getQta();

*/

Una classe ben fatta viene integrata dei metodi GETTER e SETTER (get e set) , la prima funzione dovrà restituire dei dati definendo le proprietà, mentre la seconda é responsabile della lettura delle variabili. Sostanzialmente dobbiamo a fare molta attenzione ai dati che dobbiamo incapsulare e a ciò che deve essere public, private o proitected in base al grado di sicurezza che vogliamo tutelare e in base all’ accessibilità della classe e delle loro derivate (in quest’ ultimo caso protected). Dare l’accesso a specifiche proprietà dall’ esterno con PUBLIC è molto pericoloso, perché si rischia di alterare la logica del progetto, gli oggetti vanno protetti il più possibile per evitare manipolazioni multiple e stravolgimenti del codice. Le tecniche di incapsulation prevedono dunque come visto i metodi getter e setter per settare e leggere rispettivamente le proprietà critiche. L’incapsulazione è sostanzialmente l’operazione di protezione dei dati per le nostre classi, al fine di evitare mosse  pericolose potenziali con l’accessibilità publica alle classi dall’ esterno.

Annunci

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...