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 Приношу свои извинения не англоязычным докладчикам. Это небольшая шутка. Насколько я знаю, нет такой вещи, как "топиная рукавица". Если бы это было так, это была бы рукавица для сбора горячего тоста. Возможно, у вас есть тосты в вашей родной стране?