Junior
Kas yra sąsajos PHP?
sobes.tech AI
Atsakymas iš AI
PHP sąsaja yra sutartis, aprašanti metodų rinkinį (su jų parašais), kuriuos turi įgyvendinti klasė. Ji apibrėžia "ką" klasė daro, bet ne "kaip".
- Sutartis: Klasė, įgyvendinanti sąsają, įsipareigoja pateikti visus šioje sąsajoje aprašytus metodus su tais pačiais pavadinimais, parametrais ir grąžinimo tipais.
- Tipų paveldėjimas: Sąsajos leidžia apibrėžti tipus pagal elgesį, o ne tik klasės hierarchiją. Tai naudinga polimorfizmui. Galite dirbti su skirtingų klasių objektais, kurie įgyvendina vieną sąsają, tarsi jie būtų to paties tipo.
- Daugkartinis elgesio paveldėjimas: PHP nepalaiko daugybinio klasių paveldėjimo, bet klasė gali įgyvendinti kelias sąsajas. Tai leidžia klasei turėti elgesį iš kelių sutarčių.
- Atsakomybės atskyrimas: Sąsajos padeda atskirti elgesio apibrėžimą nuo jo įgyvendinimo.
<?php
// Sąsajos apibrėžimas
interface Logger
{
/**
* Užrašo žinutę į žurnalą.
* @param string $message Žinutė įrašymui.
*/
public function log(string $message): void;
}
// Klasė, įgyvendinanti sąsają
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);
}
}
// Kita klasė, įgyvendinanti tą patį sąsają
class DatabaseLogger implements Logger
{
private $dbConnection; // Tikėtinas ryšio objektas
public function __construct($dbConnection)
{
$this->dbConnection = $dbConnection;
}
public function log(string $message): void
{
// Logika įrašyti į duomenų bazę
// ...
echo "Logging to database: " . $message . PHP_EOL;
}
}
// Sąsajos naudojimas su skirtingomis įgyvendinimais
function processData(Logger $logger, string $data): void
{
// Duomenų apdorojimas
// ...
$logger->log("Processed data: " . $data);
}
$fileLogger = new FileLogger('/var/log/app.log');
$dbLogger = new DatabaseLogger(null); // Pavyzdys, kaip jungtis prie duomenų bazės
processData($fileLogger, 'Pavyzdiniai duomenys 1');
processData($dbLogger, 'Pavyzdiniai duomenys 2');
Pagrindiniai skirtumai nuo abstrakčių klasių:
| Savybė | Sąsaja | Abstrakti klasė |
|---|---|---|
| Nariai | Tik metodai (metodai turi būti vieši) | Metodai (vieši, apsaugoti), savybės |
| Metodų įgyvendinimas | Be įgyvendinimo (tik parašai) | Gali turėti įgyvendintus metodus |
| Paveldėjimas | Klasė gali įgyvendinti kelias sąsajas | Klasė gali paveldėti tik vieną abstrakčią klasę |
| Konstruktorius | Ne | Gali turėti konstruktorių |
| Narių matomumas | Tik public |
public, protected |