fork download
  1. <?php
  2. header("Content-Type: text/plain");
  3.  
  4. /* Программа для расчета зарплаты сотрудников международной динамично развивающейся компании «Вектор»
  5.   Объекты в PHP, часть 2
  6.  */
  7.  
  8.  
  9. class Employee
  10. {
  11. public $norm = 40; // недельная норма рабочих часов
  12. public $name; // фамилия-имя
  13. public $rate; // часовая ставка (сколько он получает тугриков за час работы)
  14. public $hours = array(); // массив, содержащий отработанные часы по неделям
  15.  
  16.  
  17. public function __construct($name, $rate)
  18. {
  19. // задаем имя и часовую ставку
  20. $this->name = $name;
  21. $this->rate = $rate;
  22. }
  23.  
  24. /* Считает общее число отработанных часов */
  25. public function getTotalHoursWorked()
  26. {
  27. // Просто складываем значения часов в массиве
  28. return array_sum($this->hours);
  29. }
  30.  
  31. /* Считает число часов переработки */
  32. public function getOvertimeHours() {
  33. $totalOvertimeHours=0;
  34. $overtimeHours=0;
  35. foreach ($this->hours as $week) {
  36. if ($week > $this->norm) {
  37. $overtimeHours = $week - $this->norm;
  38. }
  39. $totalOvertimeHours += $overtimeHours;
  40. }
  41. return $totalOvertimeHours;
  42. }
  43.  
  44. /* Считает зарплату */
  45. public function getSalary()
  46. {
  47. // Получаем число отработанных часов
  48. $totalHours = $this->getTotalHoursWorked();
  49. $overtimeHours = $this->getOvertimeHours();
  50. // и умножаем на часовую ставку
  51. $salary = (($totalHours - $overtimeHours) * $this->rate)+($overtimeHours * $this->rate * 2);
  52. return $salary;
  53. }
  54.  
  55. /* Выводит короткое имя */
  56. public function getShortName() {
  57. $shortName = preg_replace ("/(\\w*)(\\s+)(\\w)(\\w*)/u", "$1 $3.", $this->name);
  58. return $shortName;
  59. }
  60. }
  61.  
  62. $ivan = new Employee("Иванов Иван", 10);
  63. // name и rate заданы через конструктор, потому осталось лишь написать часы
  64. $ivan->hours = array(40, 40, 40, 40); // Иван работает по 40 часов в неделю
  65.  
  66. $peter = new Employee("Петров Петр", 8);
  67. $peter->hours = array(40, 10, 40, 50); // Петр взял отгул и потому отработал меньше часов,
  68.  
  69. // Компания
  70. class Company {
  71. public $name = "";
  72. public $employees = array(); // Работники
  73. public $totalHours = 0; // Всего часов для всех работников
  74. public $totalSalary = 0; // Всего бананов выплачено
  75. public $totalOvertime = 0; // Всего переработки
  76.  
  77. public function __construct ($name) {
  78. $this->$name = $name;
  79. }
  80.  
  81. // Добавление работника
  82. public function setEmployee ($employee) {
  83. $this->employees[] = $employee;
  84. }
  85.  
  86. // Расчет часов работы для всех работников
  87. public function getTotalHours () {
  88. foreach ($this->employees as $employee) {
  89. $this->totalHours += $employee->getTotalHoursWorked();
  90. }
  91. return $this->totalHours;
  92. }
  93.  
  94. // Расчет оплаты для всех работников
  95. public function getTotalSalary () {
  96. foreach ($this->employees as $employee) {
  97. $this->totalSalary += $employee->getSalary();
  98. }
  99. return $this->totalSalary;
  100. }
  101.  
  102. // Расчет часов переработки для всех работников
  103. public function getTotalOvertime () {
  104. foreach ($this->employees as $employee) {
  105. $this->totalOvertime += $employee->getOvertimeHours();
  106. }
  107. return $this->totalOvertime;
  108. }
  109. }
  110.  
  111. $company = new Company("Vector");
  112.  
  113. // Добавляем работников в компанию
  114. $company->setEmployee($ivan);
  115. $company->setEmployee($peter);
  116.  
  117. // Ширина колонок
  118. $col1 = 30;
  119. $col2 = 8;
  120. $col3 = 15;
  121. $col4 = 8;
  122. $col5 = 8;
  123.  
  124. // Добавление пробелов слева
  125. function padLeft($string, $length) {
  126. $string = str_repeat(" ", $length-mb_strlen($string)) . $string;
  127. return $string;
  128. }
  129.  
  130. // Добавление пробелов справа
  131. function padRight($string, $length) {
  132. $string .= str_repeat(" ", $length-mb_strlen($string));
  133. return $string;
  134. }
  135.  
  136. // Заголовок таблицы
  137. echo padRight("Сотрудник", $col1) .
  138. padLeft("Часы", $col2) .
  139. padLeft("Переработка", $col3) .
  140. padLeft("Ставка", $col4) .
  141. padLeft("З/п", $col5) . "\n\n";
  142.  
  143. // Сама таблица
  144. foreach ($company->employees as $employee) {
  145. echo padRight($employee->getShortName(), $col1) .
  146. padLeft($employee->getTotalHoursWorked(), $col2) .
  147. padLeft($employee->getOvertimeHours(), $col3) .
  148. padLeft($employee->rate, $col4) .
  149. padLeft($employee->getSalary(), $col5) . "\n";
  150. }
  151.  
  152. // Итого
  153. echo padRight("Всего:", $col1) .
  154. padLeft($company->getTotalHours(), $col2) .
  155. padLeft($company->getTotalOvertime(), $col3) .
  156. padLeft("", $col4) .
  157. padLeft($company->getTotalSalary(), $col5) . "\n\n";
  158.  
  159. ?>
Success #stdin #stdout 0.02s 52472KB
stdin
Standard input is empty
stdout
Сотрудник                         Часы    Переработка  Ставка     З/п

Иванов И.                          160              0      10    1600
Петров П.                          140             10       8    1200
Всего:                             300             10            2800