PHP Autoloading Primer Autoloading replaces manual class definition loading


// autoload.php
spl_autoload_register(function ($class) {
    require_once "$class.php";

// Animal.php
class Animal {
    public function eats($food) {
         echo "Yum, $food!";

// zoo.php
require 'autoload.php';
$animal = new Animal;

// aquarium.php
require 'autoload.php';
$animal = new Animal;

Compare this to the other examples. Notice how require "Animal.php" was replaced with require "autoload.php". We're still including an external file at run-time, but rather than including a specific class definition we're including logic that can include any class. It's a level of indirection that eases our development. Instead of writing one require for every class we need, we write one require for all classes. We can replace N require with 1 require.

The magic happens with spl_autoload_register. This PHP function takes a closure and adds the closure to a queue of closures. When PHP encounters a class for which it has no definition, PHP hands the class name to each closure in the queue. If the class exists after calling a closure, PHP returns to its previous business. If the class fails to exist after trying the entire queue, PHP crashes with "Class 'Whatever' not found."