En aquest tema, explorarem dos conceptes fonamentals de la Programació Orientada a Objectes (OOP) en PHP: les interfícies i les classes abstractes. Aquests conceptes ens permeten definir estructures més flexibles i reutilitzables en el nostre codi.

Què és una Interfície?

Una interfície en PHP és una col·lecció de mètodes sense implementar que una classe pot implementar. Les interfícies defineixen un contracte que les classes han de seguir. Això permet que diferents classes implementin la mateixa interfície de maneres diferents.

Característiques de les Interfícies:

  • No poden tenir propietats.
  • Tots els mètodes han de ser públics.
  • No poden tenir implementacions de mètodes, només declaracions.
  • Una classe pot implementar múltiples interfícies.

Exemple d'Interfície:

<?php
interface Logger {
    public function log(string $message);
}

class FileLogger implements Logger {
    public function log(string $message) {
        // Implementació per escriure el missatge en un fitxer
        echo "Log to file: " . $message;
    }
}

class DatabaseLogger implements Logger {
    public function log(string $message) {
        // Implementació per escriure el missatge en una base de dades
        echo "Log to database: " . $message;
    }
}

$fileLogger = new FileLogger();
$fileLogger->log("Això és un missatge de log.");

$databaseLogger = new DatabaseLogger();
$databaseLogger->log("Això és un altre missatge de log.");
?>

Explicació:

  • Hem definit una interfície Logger amb un mètode log.
  • Les classes FileLogger i DatabaseLogger implementen la interfície Logger i proporcionen les seves pròpies versions del mètode log.

Què és una Classe Abstracta?

Una classe abstracta és una classe que no es pot instanciar directament i pot contenir mètodes abstractes (sense implementació) i mètodes concrets (amb implementació). Les classes abstractes es fan servir per crear una base per a altres classes.

Característiques de les Classes Abstractes:

  • Pot tenir propietats i mètodes.
  • Pot tenir mètodes abstractes i mètodes concrets.
  • Les classes que hereten d'una classe abstracta han d'implementar tots els mètodes abstractes.

Exemple de Classe Abstracta:

<?php
abstract class Animal {
    protected $name;

    public function __construct($name) {
        $this->name = $name;
    }

    abstract public function makeSound();

    public function getName() {
        return $this->name;
    }
}

class Dog extends Animal {
    public function makeSound() {
        return "Woof!";
    }
}

class Cat extends Animal {
    public function makeSound() {
        return "Meow!";
    }
}

$dog = new Dog("Rex");
echo $dog->getName() . " says " . $dog->makeSound();

$cat = new Cat("Whiskers");
echo $cat->getName() . " says " . $cat->makeSound();
?>

Explicació:

  • Hem definit una classe abstracta Animal amb un mètode abstracte makeSound i un mètode concret getName.
  • Les classes Dog i Cat hereten de Animal i implementen el mètode makeSound.

Comparació entre Interfícies i Classes Abstractes

Característica Interfície Classe Abstracta
Propietats No
Mètodes amb implementació No
Múltiples herències No
Instanciació No No

Exercicis Pràctics

Exercici 1: Implementar una Interfície

Defineix una interfície Shape amb un mètode calculateArea. Implementa aquesta interfície en dues classes: Circle i Rectangle.

<?php
interface Shape {
    public function calculateArea();
}

class Circle implements Shape {
    private $radius;

    public function __construct($radius) {
        $this->radius = $radius;
    }

    public function calculateArea() {
        return pi() * pow($this->radius, 2);
    }
}

class Rectangle implements Shape {
    private $width;
    private $height;

    public function __construct($width, $height) {
        $this->width = $width;
        $this->height = $height;
    }

    public function calculateArea() {
        return $this->width * $this->height;
    }
}

$circle = new Circle(5);
echo "Area of Circle: " . $circle->calculateArea();

$rectangle = new Rectangle(4, 6);
echo "Area of Rectangle: " . $rectangle->calculateArea();
?>

Exercici 2: Crear una Classe Abstracta

Defineix una classe abstracta Vehicle amb un mètode abstracte startEngine i un mètode concret getFuelType. Implementa aquesta classe en dues subclasses: Car i Motorcycle.

<?php
abstract class Vehicle {
    protected $fuelType;

    public function __construct($fuelType) {
        $this->fuelType = $fuelType;
    }

    abstract public function startEngine();

    public function getFuelType() {
        return $this->fuelType;
    }
}

class Car extends Vehicle {
    public function startEngine() {
        return "Car engine started with " . $this->getFuelType();
    }
}

class Motorcycle extends Vehicle {
    public function startEngine() {
        return "Motorcycle engine started with " . $this->getFuelType();
    }
}

$car = new Car("Gasoline");
echo $car->startEngine();

$motorcycle = new Motorcycle("Diesel");
echo $motorcycle->startEngine();
?>

Resum

En aquesta secció, hem après sobre les interfícies i les classes abstractes en PHP. Les interfícies ens permeten definir un contracte que les classes han de seguir, mentre que les classes abstractes ens permeten crear una base per a altres classes amb mètodes abstractes i concrets. Aquests conceptes són fonamentals per a la creació de codi flexible i reutilitzable en la programació orientada a objectes.

Curs de Programació PHP

Mòdul 1: Introducció a PHP

Mòdul 2: Estructures de Control

Mòdul 3: Funcions

Mòdul 4: Arrays

Mòdul 5: Treballant amb Formularis

Mòdul 6: Treballant amb Fitxers

Mòdul 7: Programació Orientada a Objectes (OOP)

Mòdul 8: Treballant amb Bases de Dades

Mòdul 9: Tècniques Avançades de PHP

Mòdul 10: Frameworks PHP i Millors Pràctiques

Mòdul 11: Projecte: Construint una Aplicació Web

© Copyright 2024. Tots els drets reservats