Menu
CoddyTech

Ôn tập: hệ thống phân cấp nhân viên

Thuộc phần Lập trình hướng đối tượng trong hành trình PHP của Coddy. Bài học 26 trên 91.

challenge icon

Thử thách

Dễ

Hãy xây dựng một hệ thống phân cấp nhân viên, kết hợp tất cả các khái niệm về tính kế thừa bạn đã học trong chương này. Bạn sẽ tạo một lớp cơ sở trừu tượng, định nghĩa những gì mọi nhân viên cần có, rồi mở rộng lớp đó bằng các kiểu nhân viên chuyên biệt, mỗi kiểu tính tiền thưởng theo cách khác nhau.

Bạn sẽ sắp xếp code trong bốn tệp:

  • Employee.php: Định nghĩa lớp Employee trừu tượng làm nền tảng cho mọi kiểu nhân viên. Lớp cần có các thuộc tính được bảo vệ là $name và $salary. Hàm khởi tạo nhận cả hai giá trị và gán chúng. Thêm phương thức getName() để trả về tên, phương thức getSalary() để trả về mức lương và phương thức trừu tượng calculateBonus() mà các lớp con phải triển khai. Ngoài ra, hãy thêm phương thức getSummary() để trả về "[name] earns $[salary] with bonus: $[bonus]", trong đó [bonus] là kết quả của việc gọi calculateBonus().
  • Manager.php: Định nghĩa lớp Manager mở rộng lớp Employee. Thêm tệp Employee ở đầu tệp. Người quản lý nhận tiền thưởng dựa trên phần trăm. Thêm thuộc tính được bảo vệ $bonusPercentage. Hàm khởi tạo nhận tên, mức lương và phần trăm tiền thưởng: dùng parent::__construct() cho hai giá trị đầu tiên, sau đó tự gán phần trăm. Triển khai calculateBonus() để trả về mức lương nhân với phần trăm tiền thưởng rồi chia cho 100.
  • Developer.php: Định nghĩa lớp Developer mở rộng lớp Employee. Thêm tệp Employee ở đầu tệp. Nhà phát triển nhận khoản tiền thưởng cố định khi hoàn thành dự án. Thêm thuộc tính được bảo vệ $projectBonus. Hàm khởi tạo nhận tên, mức lương và số tiền thưởng dự án: dùng parent::__construct() cho hai giá trị đầu tiên, sau đó tự gán tiền thưởng dự án. Triển khai calculateBonus() để chỉ trả về số tiền thưởng dự án cố định.
  • main.php: Thêm cả hai tệp Manager và Developer. Bạn sẽ nhận sáu đầu vào: tên người quản lý, mức lương của người quản lý, phần trăm tiền thưởng của người quản lý, tên nhà phát triển, mức lương của nhà phát triển và tiền thưởng dự án của nhà phát triển. Tạo một đối tượng Manager và một đối tượng Developer với các giá trị này. In kết quả gọi getSummary() trên người quản lý trước, sau đó trên nhà phát triển, mỗi kết quả trên một dòng riêng.

Thử thách này cho thấy cách các lớp trừu tượng đặt ra một giao ước: mọi nhân viên đều phải có khả năng tính tiền thưởng, nhưng cách tính thay đổi tùy theo vai trò. Lớp Manager dùng một tỷ lệ phần trăm trên mức lương, còn lớp Developer nhận một khoản tiền cố định. Phương thức getSummary() dùng chung trong lớp cha hoạt động liền mạch với cả hai cách tính tiền thưởng nhờ tính đa hình.

Tự làm thử

<?php
require_once 'Manager.php';
require_once 'Developer.php';

// Đọc dữ liệu đầu vào
$managerName = trim(fgets(STDIN));
$managerSalary = floatval(trim(fgets(STDIN)));
$managerBonusPercentage = floatval(trim(fgets(STDIN)));
$developerName = trim(fgets(STDIN));
$developerSalary = floatval(trim(fgets(STDIN)));
$developerProjectBonus = floatval(trim(fgets(STDIN)));

// TODO: Tạo đối tượng Manager từ dữ liệu đầu vào của người quản lý

// TODO: Tạo đối tượng Developer từ dữ liệu đầu vào của lập trình viên

// TODO: In ra bản tóm tắt của người quản lý (getSummary())

// TODO: In ra bản tóm tắt của lập trình viên (getSummary())
?>

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch PHP online