Autoload your classes in PHP
14 comments
Many developers writing object-oriented applications create one PHP source file per-class definition. One of the biggest annoyances is having to write a long list of needed includes at the beginning of each script (one for each class).
In PHP 5, this is no longer necessary. You may define an __autoload function which is automatically called in case you are trying to use a class/interface which hasn’t been defined yet.
This is how it works in action. We will create two classes. So create Image.php file and paste this in:
<?php
class Image {
function __construct() {
echo 'Class Image loaded successfully <br />';
}
}
?>
Now create Test.php file and paste this in:
<?php
class Test {
function __construct() {
echo 'Class Test working <br />';
}
}
?>
Basically, we created 2 simple classes with constructors which echo some text out. Now, create a file index.php and paste this in:
<?php
function __autoload($class_name) {
require_once $class_name . '.php';
}
$a = new Test();
$b = new Image();
?>
When you run index.php in browser, everything is working fine (assuming all 3 files are in the same folder). Maybe you don’t see a point, but imagine that you have 10 or more classes and have to write require_once as many times.
I will show you how to properly throw exception if you are using PHP 5.3 and above. Chane your index.php to look like this:
<?php
function __autoload($class_name) {
if(file_exists($class_name . '.php')) {
require_once($class_name . '.php');
} else {
throw new Exception("Unable to load $class_name.");
}
}
try {
$a = new Test();
$b = new Image();
} catch (Exception $e) {
echo $e->getMessage(), "\n";
}
?>
Now, it checks if file exists and throws a proper Exception if it doesn’t.
That’s it. A handy functionality to spare some typing.
To get even more excellent content, you can follow me on Twitter.
14 Responses to “Autoload your classes in PHP”
-
-
Steph says:
Hi, you could safely replace the require_once by a require, don’t care about the class is already loaded or not … if it’s already loaded then the autoload won’t be called …
-
Hossein says:
In the name of the kind Allah
Hello,
And by defining that autoload function in a separate php file and then using bottom code in htaccess we do not even need to copy/paste this autoload function in every php file:php_value auto_prepend_file “auto_loader.php”
which auto_loader.php file includes that autoload function,
Is this way useful? Or it can hit performance?
Thank you
-
Ivan Iordanov says:
__autoload is deprecated. Use spl_autoload_register instead
-
Rob says:
Umm I think I might have one better,
foreach (glob(“includes/classes/class.*.php”) as $filename)
{
include_once( $filename );
}Include all your classes just put the files in a dir called classes, then name then class.XYZ.php
maybe i am missing something…
-
Jos Esteves-Pereira says:
I think that you assume that each class is inside a file whose name is the class name plus ‘.php’. Right?
More, you assume that the class name is exactly written the same way the file name (before dot and extension).
Example: class Costumer might be inside Costumer.php
If it’s not always the case, your use of __autolaod seems tio me that doesn’t work.
Even more if you have more then one class in one file…
Is there any performance drawbacks in using this?
Would it be more effective to include each needed class manually?