web developer Umbria
oop, php, web developer Umbria

PHP e OOP: membri statici e costanti all’ interno di una classe

Articoli precedenti sullo stesso tema OOP in PHP nei portali umbriaway:

https://umbriawayinfo.wordpress.com/2019/04/07/programmazione-procedurale-oppure-oop-this-is-the-problem/

https://umbriawaypotenzia.wordpress.com/2019/04/07/php-versione-sette-introdotte-nuove-direttive-per-trasformare-il-linguaggio-in-fortemente-tipicizzato/

https://umbriawaysemplifica.wordpress.com/2019/04/08/ambito-di-visibilita-delle-variabili-in-php-public-protected-private/

https://umbriawaytarget.wordpress.com/2019/04/08/php-oop-magic-method-e-costruttori/

https://umbriawayvalorizza.wordpress.com/2019/04/08/warning-ambito-di-visibilita-publica-delle-classi-encapsulation-e-sicurezza-metodi-getter-e-setter/

https://umbriawayvendita.wordpress.com/2019/04/09/php-e-oop-magic-method-__autoload-ereditarieta-pianificazione-iniziale-con-uml/

https://umbriawaynoir.wordpress.com/2019/04/09/php-e-oop-overriding-e-polimorfismo/

web developer UmbriaEsiste un legame strettissimo tra le proprietà di una classe e l’istanza di una classe, nel senso che posso diversificare i valori tra le due classi. Posso anche impostare degli atributi specifici nella classe, esattamente come avviene in un ostello quando la cucina o certi locali sono in uso comune. Posso quindi identificare una proprietà o un metodo specifico definindolo in un certo modo con una certa sintassi tenendo presente che tutto quello che accade sulle istanze ha una ripercussione diretta su tutti gli oggetti che hanno quella caratteristica. A livello di comprensione è quello che accade nel procedurale con le variabili globali di PHP, dove tutte le variabili che hanno quella caratteristica subiranno le stesse modifiche in tutte le righe del programma. Sostanzialmente certe tipologie di variabili fanno riferimento alla classe originaria e non all’ istanza che ne scaturisce dall’ utilizzo della parola chiave NEW. Ad esempio all’ interno di una classe contatore potrei avere bisogno di una inizializzazione fissa nell’ istruzione protected static $contatore=0; in quanto il programma ha proprio questa caratteristica che non deve mutare neanche all’ esterno. Ma se volessi modificare da fuori il valore di questa variabile potrei farlo usando la notazione pattern singleton dei due punti che mi faranno accedere. La parola STATIC caratterizza una specificità nella classe, ossia è come se imponesse a tutti quelli che utilizzano la classe genitore o chi istanzia nuove classi che quella variabile ha quel valore che deve rimanere immutabile. Quindi userò una sintassi tipo:

self::$ proprietà oppure $metodo

A questo punto diamo un occhiata alla classe sorgente e quella derivata come si trasforma e come diventa:

/*

file Hits.php

<?php
class Hits {
protected $ip;
protected static $numhits = 0;
public function __construct() {
self::$numhits++;
}
public function totalHits() {
return self::$numhits;
}
public function setIp() {
$this->ip = $_SERVER[‘REMOTE_ADDR’];
$this->saveIp();
}
private function saveIp() {
// salvo dato su database
}
}

file di output index.php:

<?php
require_once “Classi/Hits.php”;
$hit = new Hits();
echo $hit -> totalHits();
echo “<br>”;
$hit = new Hits();
echo $hit -> totalHits();

file Hits1.php

<?php
class Hits {
protected $ip;
protected static $numhits = 0;
public static function increment() {
return self::$numhits++;
}
public function totalHits() {
return self::$numhits;
}
public function setIp() {
$this->ip = $_SERVER[‘REMOTE_ADDR’];
$this->saveIp();
}
private function saveIp() {
// salvo dato su database
}
}

file di lettura index1.php

<?php
require_once “Classi/Hits1.php”;
$hit = new Hits();
echo $hit::increment();
echo “<br>”;
Hits::increment();
echo $hit->totalHits();

*/

Quindi con questi attributi specifici nella classe, abbiamo visto la parola chiave STATIC, definisco una sorta di variabile globale che ha una sua costante appartenenza con la classe originaria. Quel metodo non apparterrà quindi all’ istanza che verrà creata ma sarà una particolarità della classe originale e ci potrò accedere solo usando una sintassi tipo self::$ proprietà oppure $metodo che avrà ripercussioni su tutte le aree del progetto che utilizzano quella proprietà. Non posso manipoalre queste variabili globali con la parola chiave THIS che fa riferimento all’ oggetto corrente, mentre abbiamo detto che una istanza non si porta dietro le caratteristiche esclusive della classe originaria.La parola chiave self fa riferimento alla classe di origine stessa.