PHP: Interface
Đối tượng interface (giao diện) cho phép bạn tạo mã lệnh để xác định những phương thức mà một lớp phải thực thi, bạn không được định nghĩa những phương thức trong interface mà chỉ được khai báo chúng.
Việc định nghĩa interface cũng giống như định nghĩa một lớp chỉ khác là ta dùng từ khóa interface thay cho từ khóa class và không có bất kỳ một phương thức nào được định nghĩa trong đó.
Tất cả các phương thức trong interface đều phải là public (đây là tầm vực duy nhất sử dụng được trong interface).
Thực thi interface
Để thực thi một interface thì ta sử dụng toán tử implements. Tất cả các phương thức trong interface phải được thực thi trong lớp class nếu không sẽ phát sinh lỗi. Mỗi lớp có quyền thực thi nhiều interface, khi đó ta dùng dấu phẩy (,) để phân cách các interface.
Lưu ý:
Trước PHP 5.3.9, một lớp không được phép thực thi hai interface mà có chứa phương thức cùng tên vì điều này sẽ gây ra sự mơ hồ. Các phiên bản hiện tại cho phép điều này miễn là các phương thức cùng tên phải có cùng signature.
Interface cũng có quyền mở rộng giống như lớp bằng cách sử dụng từ khóa extends.
Lớp thực thi interface thì phải sử dụng đúng phương thức của interface đó với tên và signature y như đã được khai báo ở interface.
Hằng
Interface được quyền chứa các hằng. Các hằng của interface làm việc như là các hằng của lớp ngoại trừ chúng không thể được ghi đè bởi lớp/interface thừa kế.
Ví dụ
Ví dụ 1: Ví dụ Interface
<?php
// Khai báo interface 'iTemplate'
interface iTemplate
{
public function setVariable($name, $var);
public function getHtml($template);
}
// Thực thi interface
class Template implements iTemplate
{
private $vars = array();
public function setVariable($name, $var)
{
$this->vars[$name] = $var;
}
public function getHtml($template)
{
foreach($this->vars as $name => $value) {
$template = str_replace('{' . $name . '}', $value, $template);
}
return $template;
}
}
// Phát sinh lỗi: lớp BadTemplate không thực thi đầy đủ các phương thức của interface
class BadTemplate implements iTemplate
{
private $vars = array();
public function setVariable($name, $var)
{
$this->vars[$name] = $var;
}
}
?>
Ví dụ 2: Mở rộng interface
<?php
interface a
{
public function foo();
}
interface b extends a
{
public function baz(Baz $baz);
}
class c implements b
{
public function foo()
{
}
public function baz(Baz $baz)
{
}
}
// Phát sinh lỗi: signature của phương thức baz() không giống với khai báo ở interface b
class d implements b
{
public function foo()
{
}
public function baz(Foo $foo)
{
}
}
?>
Ví dụ 3: Thừa kế nhiều interface
<?php
interface a
{
public function foo();
}
interface b
{
public function bar();
}
interface c extends a, b
{
public function baz();
}
class d implements c
{
public function foo()
{
}
public function bar()
{
}
public function baz()
{
}
}
?>
Ví dụ 4: Hằng trong interface.
<?php
interface a
{
const b = 'Interface constant';
}
// In ra: Interface constant
echo a::b;
// Phát sinh lỗi: không được ghi đè hằng của interface.
class b implements a
{
const b = 'Class constant';
}
?>