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