Существует несколько видов работников: программист, дизайнер, тестировщик, менеджер . Есть разные виды работ: 1) писать код, 2) тестировать код, 3)общаться с менеджером, 4) рисовать, 5)ставить задачи. Каждый из работников может выполнять определенную работу, к примеру программист может выполнять 1,2 и 3 виды работ, дизайнер в свою очередь 3,4, тестировщик - 2,3,5 и менеджер - 5. Нужно cоздать метод, который будет выводить виды работ которые может выполнять работник, к примеру
$developer = new Developer();
$developer->typeOfWork()
// на выходе получаем:
// - code writing
// - code testing
// - communication with manager
и возможность проверить, может ли этот работник выполнять конкретную работу, например $developer->getWriteCode(); - вернет true. $developer->getDraw() - вернет false. В своем решении я создал абстрактный класс Employee с 5ю защищенными переменными (видами работ) $writeCode, $draw и т.д., которые по умолчанию равны false. Также я создал методы, которые выводят значения этих защищенных свойств, getWriteCode() и т.д. и один метод для итерации свойств метода и вывода всех работ ( по типу typeOfWork() как я писал ранее) Далее я Наследую от этого Класса классы Самих работников, Developer, Designer и т.д, но в них я объявляю только свойства объекта, то есть виды работ, к примеру
class Developer extends Employee {
protected $writeCode = 'code writing';
protected $testingCode = 'code testing';
protected $communicateWithManager = 'communication with manager';
}
Получается, что для вывода определенного свойства я обращаюсь к родительскому методу(то есть в классе Employee) и вывожу значения этого свойства. Собственно вопрос, насколько это корректная структура классов? Нормально ли создавать класс в котором объявлены только свойства(например, как в классе Developer), а все методы берутся с класса-родителя? Буду благодарен любому отзыву и мнению
На мой взгляд можно сделать так: делаем интерфейсы, определяющие тип. Навешиваем эти маркеры на сотрудников. В родительском классе будет метод, который собирает все действия, которые может производить сотрудник. Примерно также можно определить и способен ли человек что-то сделать.
<?php
interface ICodeWriting {}
interface ICodeTesting {}
interface IDesigning {}
interface ICommunicationWithManager {}
abstract class Employee {
public function getTypesOfWork() {
$types = '';
if ($this instanceof ICodeWriting)
$types .= "code writing \n";
if ($this instanceof ICodeTesting)
$types .= "code testing \n";
if ($this instanceof IDesigning)
$types .= "designing \n";
if ($this instanceof ICommunicationWithManager)
$types .= "communication with manager \n";
return $types;
}
}
class Developer extends Employee implements ICodeWriting, ICodeTesting, ICommunicationWithManager { }
class Designer extends Employee implements IDesigning, ICommunicationWithManager {}
echo "developer: \n";
$developer = new Developer();
echo $developer->getTypesOfWork();
echo "\n";
echo "designer: \n";
$designer = new Designer();
echo $designer->getTypesOfWork();
Вывод:
developer:
code writing
code testing
communication with manager
designer:
designing
communication with manager
http://sandbox.onlinephpfunctions.com/code/bc758b8ab1e825c102200c6ec4a51a7f3b5bea16
Еще можно с трейтами побаловаться и в них логику попрописывать и определять данные. И подключать к соответствующим классам. Ссылка на доки про Трейты
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Подскажите как правильно подправить условия? сейчас при заходе на страницу браузер выдает ошибку HTTP ERROR 500
Как получить путь к странице с которой сделан переход, типа $_SERVER['HTTP_REFERER'] только нужен именно путь без http://