Khai báo constructor trong interface trong OOP trong PHP
Trong interface cũng có thể khai báo constructor
của lớp. Hãy xem qua ví dụ. Giả sử chúng ta quyết định
tạo lớp Rectangle, trong đó
sẽ có các phương thức để tìm diện tích, chu vi,
đồng thời một constructor nhận hai tham số.
Hãy mô tả lớp của chúng ta bằng interface:
<?php
interface iRectangle
{
public function __construct($a, $b); // constructor với hai tham số
public function getSquare();
public function getPerimeter();
}
?>
Hãy viết phần triển khai cho interface của chúng ta
iRectangle:
<?php
class Rectangle implements iRectangle
{
private $a;
private $b;
public function __construct($a, $b)
{
$this->a = $a;
$this->b = $b;
}
public function getSquare()
{
return $this->a * $this->b;
}
public function getPerimeter()
{
return 2 * ($this->a + $this->b);
}
}
?>
Việc khai báo constructor trong interface đã mang lại cho chúng ta điều gì? Thứ nhất, chúng ta sẽ không quên triển khai constructor trong lớp. Thứ hai, interface chỉ rõ rằng constructor của lớp phải nhận hai tham số: không nhiều hơn, không ít hơn. Điều này cũng bảo vệ chúng ta khỏi những lỗi ngẫu nhiên.
Tại sao chúng ta lại tạo một interface riêng iRectangle,
mà không thêm constructor vào interface Figure?
Bởi vì tất cả các hình có số lượng cạnh khác nhau
và, tương ứng, số lượng tham số
trong constructor cũng khác nhau. Do đó, chúng ta buộc phải
tạo một interface riêng biệt, chính xác hơn
cho riêng hình chữ nhật.
Hãy tạo interface iCube, interface này
sẽ mô tả hình Khối lập phương. Hãy để interface của bạn
mô tả constructor, nhận cạnh của khối lập phương làm tham số, cũng như các phương thức để lấy
thể tích khối lập phương và diện tích bề mặt.
Hãy tạo lớp Cube, triển khai interface
iCube.
Hãy tạo interface iUser, interface này
sẽ mô tả người dùng. Dự kiến rằng
người dùng sẽ có tên và tuổi và các trường này sẽ
được truyền qua tham số của constructor. Hãy để
interface của bạn cũng quy định rằng người dùng
sẽ có các getter (nhưng không phải setter) cho tên và
tuổi.
Hãy tạo lớp User, triển khai interface
iUser.