Перегрузка методов есть частный случай полиморфизма. С помощью перегрузки одно и то же имя может обозначать различные методы, причем методы могут различаться количеством и типом параметров. Наиболее актуально это для конструкторов. 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 обязательна!

URI

Html (ЖЖ)

BB-код (Для форумов)