Перегрузка методов есть частный случай полиморфизма. С помощью перегрузки одно и то же имя может обозначать различные методы, причем методы могут различаться количеством и типом параметров. Наиболее актуально это для конструкторов. Ho PHP не позволяет иметь несколько методов __construct() в классе. Как же быть?
Предположим у нас есть класс Студент, и мы хотим создавать студентов на основе их студенческого номера или имени. А может быть номера мобильного телефона или емейл. Или еще как-нибудь.
Можно конечно напихать уродливых IF-ов в конструктор для определения аргументов.
Но есть более изящное решение. Это статические фабрики-помошники с разными аргументами, создающие объект. Собственно конструктор можно даже сделать недоступным, а можно оставить как один из возможных вариантов создания объекта.
Пример
class Student { protected $dataSource; protected $firstName; protected $lastName; protected $id; protected function __construct() { $this->dataSource = new DataSource(); } static function createStudentWithName($firstName, $lastName) { $instance = new self(); $id = $instance->dataSource->getIdFromName($firstName, $lastName); $instance->setName($firstName, $lastName); $instance->setId($id); return $instance; } static function createStudentWithID($id) { $instance = new self(); list($firstName, $lastName) = $instance->dataSource->getNameFromId($id); $instance->setName($firstName, $lastName); $instance->setId($id); return $instance; } //static function createStudentWithPhone($phoneNumber) //static function createStudentWithEmail($email) protected function setId($id) { $this->id = $id; } protected function setName($firstName, $lastName) { $this->firstName = $firstName; $this->lastName = $lastName; } } $student1 = Student::createStudentWithID(10); $student2 = Student::createStudentWithName("Petr", "Sidorov");
Постоянные ссылки
При копировании ссылка на TeaM RSN обязательна!