PHP's __autoload()
(documentation) is pretty interesting to me. Here's how it works:
new Toast_Mitten()
(footnote1)__autoload()
function defined." It runs it.Toast_Mitten
to classes/toast_mitten.php
and told it to require that file. It does.Memory benefit: you only load the classes you need. Terseness benefit: you can stop including so many files everywhere and just include your autoloader.
Things get particularly interesting if
1) Your __autoload()
has an automatic way of determining the file path and name from the class name. For instance, maybe all your classes are in classes/
and Toast_Mitten
will be in classes/toast_mitten.php
. Or maybe you name classes like Animal_Mammal_Weasel
, which will be in classes/animal/mammal/animal_mammal_weasel.php
.
2) You use a factory method to get instances of your class.
$Mitten = Mitten::factory('toast');
The Mitten::factory method can say to itself, "let's see, do I have a subclass called Toast_Mitten()
? If so, I'll return that; if not, I'll just return a generic instance of myself - a standard mitten. Oh, look! __autoload()
tells me there is a special class for toast. OK, here's an instance!"
Therefore, you can start out using a generic mitten throughout your code, and when the day comes that you need special behavior for toast, you just create that class and bam! - your code is using it.
My question is twofold:
1 My apologies to non-native English speakers. This is a small joke. There is no such thing as a "toast mitten," as far as I know. If there were, it would be a mitten for picking up hot toast. Perhaps you have toast mittens in your own country?
Both Ruby and PHP get it from AUTOLOAD in Perl.
Note that the AutoLoader module is a set of helpers for common tasks using the AUTOLOAD functionality.
__autoload()
. It's a global thing so, by definition, it's somewhat evil. Instead, use spl_autoload_register()
to register yet another autoloader to your system. This allows you to use several autoloaders, what is pretty common practice.new MyProject\IO\FileReader();
should be in MyProject/IO/FileReader.php
file. Magic is evil!
The Mitten::factory method can say to itself, "let's see, do I have a subclass called Toast_Mitten()? If so, I'll return that; if not, I'll just return a generic instance of myself - a standard mitten. Oh, look! __autoload() tells me there is a special class for toast. OK, here's an instance!"
Rather such tricky code, use simple and verbose one:
try {
$mitten = new ToastMitten();
// or $mitten = Mitten::factory('toast');
} catch (ClassNotFoundException $cnfe) {
$mitten = new BaseMitten();
}
I think this feature comes in very handy, and I have not seen any features like it else where. Nor have I needed these features else where.
Java has something similar. It's called a ClassLoader
. Probably other languages too, but they stick with some default implementation.
And, while we're at this. It would have been nice if __autoload
loaded any type of symbols, not just classes: constants, functions and classes.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With