Junior
Ինչ են PHP-ի ինտերֆեյսները?
sobes.tech AI
Պատասխան AI-ից
PHP-да интерфейсը մի պայմանագիր է, որը նկարագրում է մեթոդների հավաքածու (նրանց սիգնատուրաներով), որոնք պետք է իրականացնել դասը։ Այն որոշում է՝ "ինչ" է անում դասը, բայց ոչ՝ "ինչպես"։
- Պայմանագիր: Ինտերֆեյսը իրականցնող դասը պարտավոր է տրամադրել բոլոր մեթոդները, որոնք նշված են այդ ինտերֆեյսում, նույն անուններով, պարամետրերով և վերադարձի տիպերով։
- Տիպերի ժառանգություն: Ինտերֆեյսները թույլ են տալիս սահմանել տիպեր՝ հիմնված վարքագծի վրա, ոչ միայն դասերի ժառանգականությամբ։ Սա օգտակար է պոլիմորֆիզմի համար։ Դուք կարող եք աշխատել տարբեր դասերի օբյեկտների հետ, որոնք իրականացնում են մեկ ինտերֆեյս, կարծես նույն տիպի լինեն։
- Բազմակի վարքագծի ժառանգություն: PHP-ն չի աջակցում բազմակի ժառանգությանը, բայց դասը կարող է իրականացնել մի քանի ինտերֆեյս։ Սա թույլ է տալիս դասին ունենալ մի քանի պայմանագրերից ժառանգած վարքագիծ։
- Պատասխանատվությունների բաժանում: Ինտերֆեյսները օգնում են վարքագծի սահմանումը բաժանել իր իրականացմանից։
<?php
// Ինտերֆեյսի սահմանում
interface Logger
{
/**
* Գրանցում է հաղորդագրությունը։
* @param string $message Հաղորդագրություն գրանցելու համար։
*/
public function log(string $message): void;
}
// Ինտերֆեյսը իրականցնող դաս
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);
}
}
// Այլ դաս, որը իրականացնում է նույն ինտերֆեյսը
class DatabaseLogger implements Logger
{
private $dbConnection; // Կանխատեսվող կապի օբյեկտ
public function __construct($dbConnection)
{
$this->dbConnection = $dbConnection;
}
public function log(string $message): void
{
// Լոգիկա տվյալների բազայում պահելու համար
// ...
echo "Logging to database: " . $message . PHP_EOL;
}
}
// Ինտերֆեյսի օգտագործում տարբեր իրականացումների հետ
function processData(Logger $logger, string $data): void
{
// Տվյալների մշակումը
// ...
$logger->log("Processed data: " . $data);
}
$fileLogger = new FileLogger('/var/log/app.log');
$dbLogger = new DatabaseLogger(null); // Օրինակ՝ կապի համար
processData($fileLogger, 'Օրինակ տվյալ 1');
processData($dbLogger, 'Օրինակ տվյալ 2');
Հիմնական տարբերությունները՝ համեմատած աբստրակտ դասերի հետ՝
| Գծագիր | Ինտերֆեյս | Աբստրակտ դաս |
|---|---|---|
| Անդամների տեսակները | Միայն մեթոդներ (մեթոդները պետք է լինեն հանրային) | Մեթոդներ (հանրային, պաշտպանված), հատկություններ |
| Մեթոդների իրականացում | Չի լինի իրականացում (միայն սիգնատուրաներ) | Կարող է պարունակել իրականացված մեթոդներ |
| ժառանգություն | Դասը կարող է իրականացնել մի քանի ինտերֆեյս | Դասը կարող է ժառանգել միայն մեկ աբստրակտ դաս |
| Կոնստրուկտոր | Չի լինի | Կարող է ունենալ կոնստրուկտոր |
| Անդամների տեսանելիությունը | Միայն public |
public, protected |