PHP __autoload() (документация) мне очень интересна. Вот как это работает:
- Вы пытаетесь использовать класс, например
new Toast_Mitten()(footnote 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) Вы используете метод factory для получения экземпляров вашего класса.
$Mitten = Mitten::factory('toast');
Метод Mitten:: factory может сказать себе: "Посмотрим, у меня есть подкласс, называемый Toast_Mitten()? Если это так, я верну его, а если нет, я просто верну общий пример о себе, стандартная рукавица. О, посмотри! __autoload() говорит мне, что есть специальный класс для тостов. ОК, вот экземпляр!"
Таким образом, вы можете начать использовать универсальную рукавицу во всем своем коде, и когда наступит день, вам нужно специальное поведение для тоста, вы просто создаете этот класс и bam! - ваш код использует он.
Мой вопрос двоякий:
- (Факт) Имеют ли другие языки подобные конструкции? Я вижу, что Ruby имеет автозагрузку, но, похоже, вам нужно указать в заданном script, какие классы вы планируете использовать.
- (Мнение) Является ли это слишком волшебным? Если ваш любимый язык не делает этого, вы думаете: "Эй, изящный, мы должны иметь это" или "человек, я рад, что язык X не такой неряшливый?"
1 Приношу свои извинения не англоязычным докладчикам. Это небольшая шутка. Насколько я знаю, нет такой вещи, как "топиная рукавица". Если бы это было так, это была бы рукавица для сбора горячего тоста. Возможно, у вас есть тосты в вашей родной стране?