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

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