Interface

Interface 類別主要用於定義一些關鍵字及 public 的抽象方法,不需要定義方法的 body 及參數。

<?php
interface Logger{
    public function excute();
}

首先,針對未使用 Interface 的情況進行說明,

如果在大型專案只有使用 Class,例如以下範例,當我們要切換不同的 Log 方式時,就要透過手動方式在多處 constructor 處進行 hard-coded 變更,例如

<?php

class LogToDatabase {
    public function execute($message)
    {
        var_dump('log the message to a database :'.$message);
    }
}

class LogToFile {
    public function execute($message)
    {
        var_dump('log the message to a file :'.$message);
    }
}

class UsersController { 
    protected $logger;
    
    public function __construct(LogToFile $logger)
    {
        $this->logger = $logger;
    }
    
    public function show()
    { 
        $user = 'nahid';
        $this->logger->execute($user);
    }
}

$controller = new UsersController(new LogToFile);
$controller->show();

例如,目前在 UsersController 使用 LogToFile,

<?php
public function __construct(LogToFile $logger)

要手動改成

<?php
public function __construct(LogToDatabase $logger)

使用 Interface 則可以統一界定一個格式,在 constructor 只需要注入 Interface 即可。 我們只需要在 new 來統一做設定。

<?php

interface Logger 
{
    public function execute($message);
}

class LogToDatabase implements Logger 
{
    public function execute($message){
        var_dump('log the message to a database :'.$message);
    }
}

class LogToFile implements Logger 
{
    public function execute($message) 
    {
        var_dump('log the message to a file :'.$message);
    }
}

class UsersController 
{
    protected $logger;
    
    public function __construct(Logger $logger) 
    {
        $this->logger = $logger;
    }
    
    public function show() 
    {
        $user = 'nahid';
        $this->logger->execute($user);
    }
}

$controller = new UsersController(new LogToDatabase);
$controller->show();

參考: https://medium.com/better-programming/understanding-use-of-interface-and-abstract-class-9a82f5f15837 https://www.w3schools.com/php/php_oop_classes_abstract.asp