Như đã nêu, các giao diện chỉ có thể xác định các phương thức hiển thị công khai. Tôi muốn đưa ra một ví dụ về cách các phương thức được bảo vệ có thể được xử lý. Để áp đặt việc sử dụng các phương thức được bảo vệ cụ thể, có thể tạo một lớp trừu tượng thực hiện giao diện.
Điều này đặc biệt có ý nghĩa nếu lớp trừu tượng đã có thể xử lý một số khối lượng công việc, để đơn giản hóa việc triển khai thực tế. Ví dụ ở đây, một lớp trừu tượng đảm nhiệm việc khởi tạo đối tượng kết quả, đối tượng này luôn cần thiết:
Trước hết, giao diện.
interface iService
{
public function doSomething();
}
Sau đó, lớp trừu tượng xác định cấu trúc phương thức bên trong:
abstract class AbstractService implements iService
{
public function doSomething()
{
$result = new ServiceResult();
$this->process($result);
return $result;
}
abstract protected function process($result);
}
Lớp thực hiện việc triển khai thực tế sẽ tự động kế thừa giao diện từ lớp trừu tượng và chỉ cần triển khai phương thức được bảo vệ.
class ExampleService extends AbstractService
{
protected function process($result)
{
$result->setSuccess('All done');
}
}
Bằng cách này, giao diện hoàn thành hợp đồng chung và thông qua AbstractService
lớp, hợp đồng nội bộ được thực hiện. Ứng dụng chỉ cần thực thi việc sử dụng AbstractService
lớp ở bất kỳ nơi nào có thể.