Насколько уникален PHP __autoload ()?

PHP __ autoload () ( документация ) мне очень интересен. Вот как это работает:

  • Вы пытаетесь использовать класс, например new Toast_Mitten () (сноска 1 )
  • Класс не был загружен в память. PHP отводит кулак, чтобы вывести вас из строя.
  • Он делает паузу. «Подожди», - говорит он. «Определена функция __ autoload () ». Он запускает его.
  • В этой функции вы каким-то образом сопоставили строку Toast_Mitten с classes / toast_mitten.php и сказали ей, чтобы она потребовала этот файл. Так и есть.
  • Теперь класс находится в памяти, и ваша программа продолжает работать.

Преимущество памяти: вы загружаете только те классы, которые вам нужны. Преимущество краткости: вы можете перестать включать столько файлов повсюду и просто включить свой автозагрузчик.

Все становится особенно интересно, если

1) ваш __ autoload () имеет автоматический способ определения пути и имени файла из название класса. Например, возможно, все ваши классы находятся в classes / , а Toast_Mitten будут в classes / toast_mitten.php . Или, может быть, вы назовете классы вроде Animal_Mammal_Weasel , которые будут в classes / animal / mammal / animal_mammal_weasel.php .

2) Вы используете фабричный метод для получения экземпляров своего класса .

$Mitten = Mitten::factory('toast');

Метод Mitten :: factory может сказать себе: «Посмотрим, есть ли у меня подкласс с именем Toast_Mitten () ? Если да, я верну его; если нет, я» Я просто верну свой родовой экземпляр - стандартную варежку. О, посмотри! __ autoload () сообщает мне, что - это специальный класс для тостов. Хорошо, вот вам пример! "

Таким образом, вы можете начать использовать обычную варежку на протяжении всего кода, а когда придет день, когда вам понадобится особое поведение для тоста, вы просто создадите этот класс и бац! - ваш код использует его.

У меня двоякий вопрос:

  • ( Факт ) Есть ли в других языках похожие конструкции? Я вижу, что Ruby имеет автозагрузку , но кажется, что вы должны указать в данном скрипте, в каких классах вы собираетесь его использовать.
  • ( Мнение ) Это слишком волшебно? Если ваш любимый язык не делает этого, как вы думаете , "эй, классно, у нас должно быть это" или "человек, я"

    Когда еще рекомендуется такая практика?

    В каких случаях можно использовать константную ссылку и каковы преимущества перед простой передачей ее, например, через указатель?

    А как насчет этого void MyObject :: Somefunc ( const std :: string & mystring) Какой смысл иметь константную строку, если строка на самом деле уже является неизменяемым объектом?

22
задан jww 22 November 2018 в 07:32
поделиться