Interfejs to szablon składający się ze stałych i deklaracji metod, które muszą być użyte w klasach, które go zaimplementują.
Interfejs deklarujemy modyfikatorem interface:
1 2 3 |
interface InterfaceName { // deklaracja stałych i/lub metod } |
Dana klasa może implementować wiele interfejsów:
1 2 3 |
class ClassName implements Interface1, Interface2, Interface3... { // ... } |
Interfejsy mogą dziedziczyć inne interfejsy:
1 2 3 |
interface InterfaceName extends Interface1, Interface2, Interface3... { // ... } |
Przykład interfejsu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php // Connection.php interface Connection { const HOST = 'localhost'; const PORT = 22; const USERNAME = 'root'; const PASSWORD = '**********'; const DBNAME = 'database'; function linkDB(); } ?> |
Jak widać, jest to interfejs służący do połączenia się z serwerem bazy danych. Zgodnie z zasadą zawiera stałe, w tym przypadku dane do połączenia oraz definicję funkcji linkDB(), która będzie nawiązywała połączenie. Ale w jaki sposób? To określi dopiero klasa, która będzie implementowała ten interfejs 🙂
Implementacja interfejsu odbywa się za pomocą słowa kluczowgo implements:
1 2 3 |
class ClassName implements InterfaceName { // ... } |
Przykład implementacji interfejsu z pierwszego przykładu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<?php // PdoController.php require_once('Connection.php'); // dołączamy interfejs class PdoController implements Connection { private $host = Connection::HOST; private $port = Connection::PORT; private $username = Connection::USERNAME; private $password = Connection::PASSWORD; private $dbname = Connection::DBNAME; function linkDB() { try { $pdo = new PDO( 'mysql:host='.$this->host.';dbname='.$this->dbname, $this->username, $this->password ); echo 'Successful connection...'; } catch(PDOException $error) { echo $error->getMessage(); } } } // testujemy klasę $connection = new PdoController(); $connection->linkDB(); ?> |
Funkcja linkDB() korzysta ze sterownika PDO do komunikacji z bazą. Aby odwołać się do stałych z interfejsu Connection musimy użyć operatorów rozróżnionego zasięgu (::).
Schemat:
1 |
$variable = Interface::CONSTANT; |
Dodajmy kolejną klasę MysqliController, która będzie korzystać ze sterownika MySQLi do komunikacji z bazą. Zasada ta sama, jedynie wnętrze funkcji linkDB() ulegnie zmianie i nazwa obiektu, czyli: new MysqliController():
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
<?php // MysqliController.php require_once('Connection.php'); class MysqliController implements Connection { private $host = Connection::HOST; private $port = Connection::PORT; private $username = Connection::USERNAME; private $password = Connection::PASSWORD; private $dbname = Connection::DBNAME; function linkDB() { $mysqli = mysqli_connect ( $this->host, $this->username, $this->password, $this->dbname ); if (mysqli_connect_errno()) { mysqli_connect_error(); } else { echo 'Successful connection...'; } } } $connection = new MysqliController(); $connection->linkDB(); ?> |
Implementując w klasach PdoController i MysqliController jeden wspólny interfejs, funkcja linkDB() może przyjmować różne sposoby komunikacji z bazą 🙂
1 2 3 4 5 6 7 |
// PDO $connection1 = new PdoController(); $connection1->linkDB(); // MySQLi $connection2 = new MysqliController(); $connection2->linkDB(); |
Ten przykład świetnie pokazuje możliwości interfejsów. Oczywiście klasy implementujące interfejs mogą zawierać również własne funkcje oraz właściwości, nie tylko te które narzuca im interfejs.