Junior
Mi az az interfész a PHP-ben?
sobes.tech MI
Válasz az MI-től
A PHP felület egy szerződés, amely leírja az összes metódust (a szignatúráikkal), amelyeket egy osztálynak meg kell valósítania. Meghatározza, hogy "mit" csinál az osztály, de nem "hogyan".
- Szerződés: Egy olyan osztály, amely megvalósítja a felületet, vállalja, hogy biztosítja az összes ebben leírt metódust, ugyanazokkal a nevekkel, paraméterekkel és visszatérési típusokkal.
- Típusöröklés: A felületek lehetővé teszik a viselkedés alapján történő típusdefiniálást, nem csak az osztályhierarchiát. Ez hasznos a polimorfizmushoz. Különböző osztályok objektumaival dolgozhat, amelyek egy felületet valósítanak meg, mintha ugyanazon típusúak lennének.
- Többszörös viselkedés öröklése: A PHP nem támogatja az osztályok többszörös öröklését, de egy osztály több felületet is megvalósíthat. Ez lehetővé teszi, hogy az osztály több szerződésből származó viselkedést örököljön.
- Felelősségek szétválasztása: A felületek segítenek a viselkedés meghatározásának és megvalósításának szétválasztásában.
<?php
// Felület meghatározása
interface Logger
{
/**
* Naplóüzenet írása.
* @param string $message Naplóüzenet.
*/
public function log(string $message): void;
}
// Osztály, amely megvalósítja a felületet
class FileLogger implements Logger
{
private string $filePath;
public function __construct(string $filePath)
{
$this->filePath = $filePath;
}
public function log(string $message): void
{
file_put_contents($this->filePath, $message . PHP_EOL, FILE_APPEND);
}
}
// Egy másik osztály, amely megvalósítja ugyanazt a felületet
class DatabaseLogger implements Logger
{
private $dbConnection; // Feltételezett adatbázis-kapcsolat objektum
public function __construct($dbConnection)
{
$this->dbConnection = $dbConnection;
}
public function log(string $message): void
{
// Naplózás az adatbázisba
// ...
echo "Logging to database: " . $message . PHP_EOL;
}
}
// A felület használata különböző megvalósításokkal
function processData(Logger $logger, string $data): void
{
// Adatfeldolgozás
// ...
$logger->log("Processed data: " . $data);
}
$fileLogger = new FileLogger('/var/log/app.log');
$dbLogger = new DatabaseLogger(null); // Példa a kapcsolat szimulálására
processData($fileLogger, 'Példa adat 1');
processData($dbLogger, 'Példa adat 2');
A fő különbségek az absztrakt osztályokhoz képest:
| Jellemző | Felület | Absztrakt osztály |
|---|---|---|
| Tagok típusa | Csak metódusok (a metódusok nyilvánosak kell legyenek) | Metódusok (nyilvános, védett), tulajdonságok |
| Metódusok megvalósítása | Nincs megvalósítás (csak szignatúrák) | Tartalmazhat megvalósított metódusokat |
| Öröklődés | Egy osztály több felületet is megvalósíthat | Egy osztály csak egy absztrakt osztályt örökölhet |
| Konstruktor | Nem | Lehet konstruktor |
| Tagok láthatósága | Csak public |
public, protected |