Sobes.tech
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