3v4l.org

run code in 300+ PHP versions simultaneously
<?php error_reporting(-1); abstract class AbstractWorker { public $rank; public $isBoss; public function __construct(int $rank, int $isBoss) { $this->rank = $rank; $this->isBoss = $isBoss; } public function getSalary(): float { $salary = $this->getBasicSalary(); if ($this->rank == 2){ $salary *= 1.25; } elseif ($this->rank == 3){ $salary *= 1.5; } if ($this->isBoss == 1){ $salary *= 1.5; } return $salary; } public function getCoffee(): int { $coffee = $this->getBasicCoffee(); if ($this->isBoss == 1){ $coffee *= 2; } return $coffee; } public function getPages(): int { $pages = $this->getBasicPages(); if ($this->isBoss == 1){ $pages = 0; } return $pages; } abstract public function getBasicSalary(): int; abstract public function getBasicCoffee(): int; abstract public function getBasicPages(): int; } class Manager extends AbstractWorker { public function getBasicSalary(): int { return 500; } public function getBasicCoffee(): int { return 20; } public function getBasicPages(): int { return 200; } } class Marketer extends AbstractWorker { public function getBasicSalary(): int { return 400; } public function getBasicCoffee(): int { return 15; } public function getBasicPages(): int { return 150; } } class Engineer extends AbstractWorker { public function getBasicSalary(): int { return 200; } public function getBasicCoffee(): int { return 5; } public function getBasicPages(): int { return 50; } } class Analyst extends AbstractWorker { public function getBasicSalary(): int { return 800; } public function getBasicCoffee(): int { return 50; } public function getBasicPages(): int { return 5; } } class Department { private $name; private $workers = array(); public function __construct(string $name) { $this->name = $name; } public function addWorker(AbstractWorker $worker): void { $this->workers[] = $worker; } public function getNumberWorkers(): int { return count($this->workers); } public function getDepartmentSalary(): float { $totalSalary = 0; foreach ($this->workers as $worker) { $totalSalary += $worker->getSalary(); } return $totalSalary; } public function getDepartmentCoffee(): int { $totalCoffee = 0; foreach ($this->workers as $worker) { $totalCoffee += $worker->getCoffee(); } return $totalCoffee; } public function getDepartmentPages(): int { $totalPages = 0; foreach ($this->workers as $worker) { $totalPages += $worker->getPages(); } return $totalPages; } public function getDepartmentName(): string { return $this->name; } public function getWorkers(): array { return $this->workers; } public function getWorker(int $number): AbstractWorker { return $this->workers[$number]; } public function deleteWorker(int $number): void { unset($this->workers[$number]); } public function sortWorkers(): void { sort($this->workers); } } class Company { private $departments = array(); public function addDepartment(Department $department): void { $this->departments[] = $department; } public function getDepartments(): array { return $this->departments; } public function getDepartmentCount(): int { return count($this->departments); } public function __clone() { $cloneDepartment = array(); foreach ($this->departments as $department) { $cloneDepartment[] = clone $department; } $this->departments = $cloneDepartment; } } class HiringWorkers { public function addWorkersToDepartment(Department $department, string $profession, int $count, int $rank, int $isBoss): void { if ($profession == Manager::class){ for ($i = 0; $i < $count; $i++){ $department->addWorker(new Manager($rank, $isBoss)); } } elseif ($profession == Marketer::class){ for ($i = 0; $i < $count; $i++){ $department->addWorker(new Marketer($rank, $isBoss)); } } elseif ($profession == Engineer::class){ for ($i = 0; $i < $count; $i++){ $department->addWorker(new Engineer ($rank, $isBoss)); } } elseif ($profession == Analyst::class){ for ($i = 0; $i < $count; $i++){ $department->addWorker(new Analyst ($rank, $isBoss)); } } } } class Tabel { private function padLeft($value, $columnLength): void { echo $value; echo str_repeat(" ", $columnLength - mb_strlen($value)); } private function printRow(string $name, $count, $salary, $coffee, $pages, $salaryDividePages): void { $col1 = 15; $col2 = 10; $col3 = 10; $col4 = 8; $col5 = 8; $col6 = 15; echo $this->padLeft($name, $col1) . $this->padLeft($count, $col2) . $this->padLeft($salary, $col3) . $this->padLeft($coffee, $col4) . $this->padLeft($pages, $col5) . $this->padLeft($salaryDividePages, $col6) . "\n"; } public function printTabel(Company $company): void { $this->printRow("Департамент", "сотр.", "тугр.", "кофе", "стр", "тугр./стр."); echo "\n"; foreach ($company->getDepartments() as $department) { $this->printRow($department->getDepartmentName(), $department->getNumberWorkers(), $department->getDepartmentSalary(), $department->getDepartmentCoffee(), $department->getDepartmentPages(), round($department->getDepartmentSalary() / $department->getDepartmentPages(), 1)); } echo "\n"; $count = 0; $salary = 0; $coffee = 0; $pages = 0; $salaryDividePages = 0; foreach ($company->getDepartments() as $department) { $count += $department->getNumberWorkers(); $salary += $department->getDepartmentSalary(); $coffee += $department->getDepartmentCoffee(); $pages += $department->getDepartmentPages(); $salaryDividePages += round($salary / $pages, 1); } $this->printRow("Всего", $count, $salary, $coffee, $pages, $salaryDividePages); $this->printRow("Среднее", round($count / $company->getDepartmentCount(), 1), round($salary / $company->getDepartmentCount(), 1), round($coffee / $company->getDepartmentCount(), 1), round($pages / $company->getDepartmentCount(), 1), round($salaryDividePages / $company->getDepartmentCount(), 1)); } } class AnticrisisSolutions { public function cutEngineers(Company $basicCompany): void { echo "\n\nСокращение инженеров \n\n"; $company = clone $basicCompany; foreach ($company->getDepartments() as $department) { $countEngineers3Rank = 0; $countEngineers2Rank = 0; $countEngineers1Rank = 0; foreach ($department->getWorkers() as $worker) { if (get_class($worker) == Engineer::class && $worker->rank == 1){ $countEngineers1Rank++; } elseif (get_class($worker) == Engineer::class && $worker->rank == 2){ $countEngineers2Rank++; } elseif (get_class($worker) == Engineer::class && $worker->rank == 3){ $countEngineers3Rank++; } } $engineerCount = $countEngineers1Rank + $countEngineers2Rank + $countEngineers3Rank; if ($engineerCount == 0){ continue; } $numberOfAbbreviatedEngineers = ceil($engineerCount / 2.5); for ($i = $numberOfAbbreviatedEngineers; $i > 0; $i--){ if ($countEngineers1Rank >= $numberOfAbbreviatedEngineers){ $countEngineers1Rank = $numberOfAbbreviatedEngineers; $countEngineers2Rank = 0; $countEngineers3Rank = 0; } elseif ($countEngineers1Rank + $countEngineers2Rank >= $numberOfAbbreviatedEngineers){ $countEngineers2Rank = $numberOfAbbreviatedEngineers - $countEngineers1Rank; $countEngineers3Rank = 0; } else { $countEngineers3Rank = $numberOfAbbreviatedEngineers - $countEngineers1Rank - $countEngineers2Rank; } } $departmentCount = $department->getNumberWorkers(); for ($numberOfWorker = 0; $numberOfWorker < $departmentCount && $numberOfAbbreviatedEngineers != 0; $numberOfWorker++){ if (get_class($department->getWorker($numberOfWorker)) == Engineer::class && $department->getWorker($numberOfWorker)->isBoss == 0 && $countEngineers1Rank > 0){ $department->deleteWorker($numberOfWorker); $numberOfAbbreviatedEngineers--; $countEngineers1Rank --; } elseif (get_class($department->getWorker($numberOfWorker)) == Engineer::class && $department->getWorker($numberOfWorker)->isBoss == 0 && $countEngineers2Rank > 0){ $department->deleteWorker($numberOfWorker); $numberOfAbbreviatedEngineers--; $countEngineers2Rank --; } else { $department->deleteWorker($numberOfWorker); $numberOfAbbreviatedEngineers--; $countEngineers3Rank --; } } $department->sortWorkers(); } $tabel = new Tabel; $tabel->printTabel($company); } public function changeDataAnalytics() { } public function increaseManagers(Company $basicCompany): void { echo "\n\nПовышение менеджеров \n\n"; $company = clone $basicCompany; $manager1RangCount = 0; $manager2RangCount = 0; foreach ($company->getDepartments() as $department) { $manager1RangCount++; $manager2RangCount++; foreach ($department->getWorkers() as $worker) { if (get_class($worker) == Manager::class && ($worker->rank == 1)){ $manager1RangCount++; } elseif (get_class($worker) == Manager::class && ($worker->rank == 2)){ $manager2RangCount++; } } $manager1RangCount = ceil($manager1RangCount / 2); $manager2RangCount = ceil($manager2RangCount / 2); foreach ($department->getWorkers() as $worker) { if($manager1RangCount + $manager2RangCount == 0){ break; } if (get_class($worker) == Manager::class && $worker->rank == 1 && $manager1RangCount > 0){ $worker->rank++; $manager1RangCount--; } elseif (get_class($worker) == Manager::class && $worker->rank == 2 && $manager2RangCount > 0) { $worker->rank++; $manager2RangCount--; } } } $tabel = new Tabel; $tabel->printTabel($company); } } $vektor = new Company; $tabel = new Tabel; $hiringWorkers = new HiringWorkers; $departmentOfProcurement = new Department("Закупок"); $hiringWorkers->addWorkersToDepartment($departmentOfProcurement, "Manager", 9, 1, 0); $hiringWorkers->addWorkersToDepartment($departmentOfProcurement, "Manager", 3, 2, 0); $hiringWorkers->addWorkersToDepartment($departmentOfProcurement, "Manager", 2, 3, 0); $hiringWorkers->addWorkersToDepartment($departmentOfProcurement, "Marketer", 2, 1, 0); $hiringWorkers->addWorkersToDepartment($departmentOfProcurement, "Manager", 1, 2, 1); $departmentOfSales = new Department("Продаж"); $hiringWorkers->addWorkersToDepartment($departmentOfSales, "Manager", 12, 1, 0); $hiringWorkers->addWorkersToDepartment($departmentOfSales, "Marketer", 6, 1, 0); $hiringWorkers->addWorkersToDepartment($departmentOfSales, "Analyst", 3, 1, 0); $hiringWorkers->addWorkersToDepartment($departmentOfSales, "Analyst", 2, 2, 0); $hiringWorkers->addWorkersToDepartment($departmentOfSales, "Marketer", 1, 2, 1); $departmentOfAdvertising = new Department("Рекламы"); $hiringWorkers->addWorkersToDepartment($departmentOfAdvertising, "Marketer", 15, 1, 0); $hiringWorkers->addWorkersToDepartment($departmentOfAdvertising, "Marketer", 10, 2, 0); $hiringWorkers->addWorkersToDepartment($departmentOfAdvertising, "Manager", 8, 1, 0); $hiringWorkers->addWorkersToDepartment($departmentOfAdvertising, "Engineer", 2, 1, 0); $hiringWorkers->addWorkersToDepartment($departmentOfAdvertising, "Marketer", 1, 3, 1); $departmentOfLogistics = new Department("Логистики"); $hiringWorkers->addWorkersToDepartment($departmentOfLogistics, "Manager", 13, 1, 0); $hiringWorkers->addWorkersToDepartment($departmentOfLogistics, "Manager", 5, 2, 0); $hiringWorkers->addWorkersToDepartment($departmentOfLogistics, "Engineer", 5, 1, 0); $hiringWorkers->addWorkersToDepartment($departmentOfLogistics, "Manager", 1, 1, 1); $vektor->addDepartment($departmentOfProcurement); $vektor->addDepartment($departmentOfSales); $vektor->addDepartment($departmentOfAdvertising); $vektor->addDepartment($departmentOfLogistics); $tabel->printTabel($vektor); $anticrisisSolutions = new AnticrisisSolutions; $anticrisisSolutions->cutEngineers($vektor); $anticrisisSolutions->increaseManagers($vektor);
Output for 7.1.0 - 7.1.20, 7.2.6 - 7.2.33, 7.3.16 - 7.3.33, 7.4.0 - 7.4.33, 8.0.0 - 8.0.30, 8.1.0 - 8.1.28, 8.2.0 - 8.2.18, 8.3.0 - 8.3.4, 8.3.6
Департамент сотр. тугр. кофе стр тугр./стр. Закупок 17 9612.5 350 3100 3.1 Продаж 24 13550 610 3325 4.1 Рекламы 36 16300 575 5450 3 Логистики 24 11375 425 3850 3 Всего 101 50837.5 1960 15725 13.2 Среднее 25.3 12709.4 490 3931.3 3.3 Сокращение инженеров Департамент сотр. тугр. кофе стр тугр./стр. Закупок 17 9612.5 350 3100 3.1 Продаж 24 13550 610 3325 4.1 Рекламы 35 15900 560 5300 3 Логистики 22 10375 385 3450 3 Всего 98 49437.5 1905 15175 13.3 Среднее 24.5 12359.4 476.3 3793.8 3.3 Повышение менеджеров Департамент сотр. тугр. кофе стр тугр./стр. Закупок 17 10612.5 350 3100 3.4 Продаж 24 14425 610 3325 4.3 Рекламы 36 16925 575 5450 3.1 Логистики 24 12875 425 3850 3.3 Всего 101 54837.5 1960 15725 14.3 Среднее 25.3 13709.4 490 3931.3 3.6
Output for 8.3.5
Warning: PHP Startup: Unable to load dynamic library 'sodium.so' (tried: /usr/lib/php/8.3.5/modules/sodium.so (libsodium.so.23: cannot open shared object file: No such file or directory), /usr/lib/php/8.3.5/modules/sodium.so.so (/usr/lib/php/8.3.5/modules/sodium.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0 Департамент сотр. тугр. кофе стр тугр./стр. Закупок 17 9612.5 350 3100 3.1 Продаж 24 13550 610 3325 4.1 Рекламы 36 16300 575 5450 3 Логистики 24 11375 425 3850 3 Всего 101 50837.5 1960 15725 13.2 Среднее 25.3 12709.4 490 3931.3 3.3 Сокращение инженеров Департамент сотр. тугр. кофе стр тугр./стр. Закупок 17 9612.5 350 3100 3.1 Продаж 24 13550 610 3325 4.1 Рекламы 35 15900 560 5300 3 Логистики 22 10375 385 3450 3 Всего 98 49437.5 1905 15175 13.3 Среднее 24.5 12359.4 476.3 3793.8 3.3 Повышение менеджеров Департамент сотр. тугр. кофе стр тугр./стр. Закупок 17 10612.5 350 3100 3.4 Продаж 24 14425 610 3325 4.3 Рекламы 36 16925 575 5450 3.1 Логистики 24 12875 425 3850 3.3 Всего 101 54837.5 1960 15725 14.3 Среднее 25.3 13709.4 490 3931.3 3.6
Output for 7.0.0 - 7.0.25
Fatal error: Uncaught TypeError: Return value of Department::addWorker() must be an instance of void, none returned in /in/oLuMG:145 Stack trace: #0 /in/oLuMG(248): Department->addWorker(Object(Manager)) #1 /in/oLuMG(456): HiringWorkers->addWorkersToDepartment(Object(Department), 'Manager', 9, 1, 0) #2 {main} thrown in /in/oLuMG on line 145
Process exited with code 255.

preferences:
164.28 ms | 401 KiB | 179 Q