Classes i objectes en PHP
Introducció
- Amb PHP podem utilitzar dos estils de programació: estructurada i orientada a objectes.
Exemple connexió BBDD amb mysqli:
// utilitzant programació estructurada
$dwes = mysqli_connect(...);
// utilitzant POO
$dwes = new mysqli();
$dwes->connect(...)
Classes en PHP
- Similar a altres llenguatges com Java o C#
- Representen quelcom real.
- Es declaren amb la paraula reservada class
- Entre claus es declaren els atributs i mètodes, que poden ser privats, públics o protegits
- Per defecte són públics
class cotxe {
protected $matricula;
protected $marca;
public function ultimo_viaje(){
}
}
Bones pràctiques (encara que no obligatòries)
- El nom de la classe sempre començarà per majúscules
- Sempre definirem cada classe en un fitxer que cridarem NombreClase.php
- Els atributs sempre seran privats o protegits (crearem getters i setters per a accedir a ells)
Objectes
Accedir als seus atributs i mètodes
- Igual que en altres llenguatges usem new per a instanciar objectes:
- Per a accedir des d’un objecte als seus atributs o mètodes, utilitzem l’operador fletxa (->):
- Haurem d’importar el fitxer que compte la classe.
$p = new Producte;
$p->nom = 'Samsung Galaxy S';
$p->mostra();
L’objecte $this
- Quan des d’un objecte s’invoca un mètode de la classe, a aquest se li passa sempre una referència a l’objecte que l’ha cridat.
- Aquesta referència s’emmagatzema en la variable $this
print "\<p>" . $this->codigo . "\</p>";
Constructor
- void __construct ([ mixed $args = “” [, $… ]] )
- Només pot haver-hi un i es dirà __construct
- Serà invocada automàticament en fer new
- És ideal per a inicialitzar les dades de l’objecte abans d’usar-ho
Mètodes màgics
- Mètodes predefinits que són cridats automàticament en determinades circumstàncies.
- Els noms dels mètodes __construct(),__destruct(), __call(), __callStatic(), __get(), __set(),__isset(), __unset(), __sleep(), __wakeup(),__toString(), __invoke(), __set_state(), __clone() i __debugInfo() són màgics en les classes PHP
public string __toString( void ):string,__invoke()
- Permet a una classe decidir com comportar-se quan se li tracta com un string o com a una funció.
- Per exemple,
- Quan faig echo $obj; s’executaria el mètode __toString() que hauria de retornar un string.
- Quan faig **echo $obj() s’executaria el mètode __invoke().
__get(),__set(),__unset(),__isset()
- S’invoquen quan s’intenta accedir a una propietat no definida. Són mult útils quan tractem amb bases de dades.
Herència
- S’utilitza la paraula reservada extends
Classes i mètodes abstractes
- Per a definir una classe o mètode abstracte utilitzem la paraula reservada abstract.
- No es podran instanciar objectes de la classe, només podrem heretar d’ella.
- Un metode abstracte obliga a les classes hereves a instanciar-lo.
Atributs i funcions statiques
- Es una variable de la classe i no de l’objecte.
- Es declaren amb la paraula static.
- S’accedix amb l’operador ::
class Coche{
private static numRodes = 4;
public static function getNumRodes()
{
return self::numRodes;
}
}
echo Coche::getNumRodes();
Cridar a mètodes de la classe base
- En PHP, si una classe heretada no té constructor propi, es cridarà automàticament al constructor de la classe base.
- Si la classe heretada defineix el seu propi constructor, caldrà realitzar la trucada explícitament.
- Utilitzarem la paraula reservada parent:: que fa referència a la classe base de la classe actual (parent::__construct())
- La paraula reservada self:: fa referència a la classe actual.
Interfícies
- És com una classe buida que solament conté declaracions de mètodes.
- Es defineixen utilitzant la paraula interface
- Si volem que una classe implemente una interfície, utilitzarem la paraula reservada implements
- Açò obligarà al fet que existisquen en la classe tots els mètodes de l’interface
- Una classe pot implementar més d’una interfície.
- Tots els mètodes d’una interfície han de ser públics
- Una interfície pot incloure constants, però no atributs
- Un interfície pot heretar d’una altra utilitzant extends.
- PHP té una sèrie d’interfícies ja definides, per exemple, l´interfície Countable
Exemple
- Teniu un exemple de tot lo vist en Exemple Objectes
Exempcions
- PHP té un model d’excepcions similar a l’existent en altres llenguatges de programació try, catch, finally.
La classes Exception
- Exception és la classe base para totes les excepcions d’usuari en PHP.
- Proporcionen mètodes per a obtenir informació de l’excepció i de traça
- getMessage. Retorna el missatge, en cas que s’haja posat algun
- getCode. Retorna el codi d’error si existeix
- Hi ha diverses exempcions ja definides, l’estructura jeràrquica i l seua sinopsi es pot vore en el següent enllaç: Documentació
Exempcions definides per l’usuari
Altra opció per a indicar un error és llançar una exempció.
- El codi susceptible de produir algun error s’introdueix en un bloc try
- Quan es produeix algun error, es llança una excepció utilitzant la instrucció throw
- Després del bloc try ha d’haver-hi com a mínim un bloc catch encarregat de processar l’error
- Si una vegada acabat el bloc try no s’ha llançat cap excepció, es continua amb l’execució en la línia següent al bloc o blocs catch
- Si hi ha alguna cosa que s’haja d’executar tant si es produeix una excepció com si no es produeix, ho posarem dins d’un bloc finally, després de l’últim bloc catch.
- Per a llançar una excepció no és necessari indicar cap paràmetre, encara que de forma opcional es pot passar un missatge d’error i també un codi d’error
Exemple
<?php
class DivisionByZero extends exception{
protected $message = "El segundo argumento es 0";
}
function dividir($a, $b){
if ($b==0){
throw new DivisionByZero;
}
return $a/$b;
}
try{
$resul1 = dividir(5, 0);
echo "Resul 1 $resul1". "<br>";
}catch(DivisionByZero $e){
echo "Excepción: ". $e->getMessage(). "<br>";
}finally{
echo "Primer finally<br>";
}
try{
$resul2 = dividir(5, 2);
echo "Resul 2 $resul2". "<br>";
}catch(DivisionByZero $e){
echo "Excepción: ". $e->getMessage(). "<br>";
}finally{
echo "Segundo finally";
}
En la primera crida a dividir es produeix una exempció i s’executen el bloc catch i finally. En el segon s’executa el try i el finally.