Introduciamo le notazioni più importanti della programmazione ad oggetti in PHP. Lasciamo ogni considerazione sulla OOP e la sua necessità di fronte a progetti complessi. A livello scolastico, la OOP in PHP raramente viene affrontata, anche dai manuali scolastici, poiché ci si concentra sulla regole di base dello scripting, della connessione col db e query varie.
In realtà, anche scomodando le ultime versioni di PHP 8, la notazione di una classe è molto semplice se si è già studiato uno o più linguaggi di programmazione OOP come C++ o Java. Diciamo che PHP ha sintassi molto simile e, spesso, regole meno stringenti dei fratelli compilati.
Diciamo che didatticamente è relativamente interessante studiare quindi la versione ad oggetti di PHP se non per introdurre uno dei framework citati anche nei nostri precedenti articoli (qui), come Symphony o Laravel che fanno di PHP un uso massiccio in OOP e pattern MVC.
Non perdiamoci ulteriormente in chiacchiere e vediamo subito un esempio. Creiamo un file persona.php. Qui diversamente da Java, non è vincolante inserire una classe per file, rispettando il nome del file e della classe con le medesime maiuscole. Qualche manuale o software suggerisce di creare i file delle classi, diversamente da quelli di sopo/funzioni, con una sintassi tipo class.nomeclasse.php per identificare meglio il contenuto. Ovviamente sta al lettore e al contesto di uso cosa scegliere.
<?php
class Persona
{
private $nome;
private $cognome;
function setNome($_nome)
{
$this->nome = $_nome;
}
function getNome()
{
return $this->nome;
}
}
Come notiamo, esistono ancora attributi che possono essere pubblici, privati o protetti come Java, le funzioni di accesso e l’uso della parola $this che agisce un po’ come il this di C++/Java anche se con una sintassi leggermente diversa per colpa della freccia e della possibile confusione del $ che si mette davanti al this ma non all’attributo puntato. Per testarla possiamo fare subito una riga di codice sotto la classe, in PHP non esiste di fatto un main eseguibile, ma è buona prassi separare le responsabilità.
Ancora, agli attributi è possibile assegnare un valore sin da subito nella classe, ma è sempre sconveniente farlo.
<?php
include "persona.php";
$pippo = new Persona();
$pippo->setNome("Alfredo");
echo $pippo->getNome();
Contrariamente a molti manuali online, preferisco sempre delimitare bene l’uso di pubblico sugli attributi e rispettare sempre e comunque le regole di buon senso dell’incapsulamento.
Facciamo un passetto in più e vediamo un costruttore e un metodo accessorio. In PHP esiste il costruttore vuoto ma solo finché non ne viene definito uno parametrico. Se è presente uno costruttori con parametri, quello vuoto non può essere ridichiarato se non con uno stratagemma farraginoso quanto inutile, soprattutto didatticamente ( c’è la funzione func_num_args() che conteggia i parametri passabili ad una funzione ad esempio). Stessa identica cosa, contrariamente a Java e C++, non possiamo definire overloading di più costruttori con parametri differenti e neanche di metodi! Sembra un limite forte, pur sempre aggirabile, usando parametri come vettori, ma tutto sommato accettabile. Il metodo stampa è stato realizzato in modo che restituisca un insieme di tag html da inserire nel punto giusto eventualmente.
<?php
class Persona
{
private $nome;
private $cognome;
private $sesso;
function setNome($_nome)
{
$this->nome = $_nome;
}
function getNome()
{
return $this->nome;
}
public function __construct($_nome, $_cognome)
{
$this->nome = $_nome;
$this->cognome = $_cognome;
$this->sesso = 'M';
}
public function stampa()
{
$stampa = "<label>Nome: </label> $this->nome <br>";
$stampa .= "<label>Cognome: </label> $this->cognome <br>";
return $stampa;
}
}
inseriamo tutto nella classe main, con tanto di diciture per effettuare il debug
<?php
ini_set ( 'display_errors', 1 );
error_reporting ( E_ALL );
include "persona.php";
$pluto = new Persona("Mario", "Rossi");
echo $pluto->stampa();
Seguiranno altri articoli sull’utilizzo della OOP con PHP con tanto di esercizi svolti.
Ultima modifica 25 Marzo 2023