Skip to content

Instantly share code, notes, and snippets.

@mhull
Last active September 14, 2018 12:47
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save mhull/61832ecd957821c8912b446e98ddcfde to your computer and use it in GitHub Desktop.
Save mhull/61832ecd957821c8912b446e98ddcfde to your computer and use it in GitHub Desktop.
A basic PHP autoloader setup
<?php
/**
* In this example, we are autoloading classes within the namespace `Acme\ExampleProject`. The file `index.php` is the
* entry point to our project; and we are using the `src` directory to store and organize our PHP class files. Our
* autoloader is located in `autoload.php`
*
* The basic behavior is illustrated in the fact that PHP will autoload the file `src/mammals/human.php` whenever we
* attempt to create a `new \Acme\ExampleProject\Mammals\Human` anywhere in our project's codebase.
*
* This diagram illustrates our project structure. Each file's contents can be found below.
*
* - /project-root
* -
* - /autoload.php
* - /index.php
* -
* - /src
* - /mammals
* - /human.php
*
* This example does not consider all complications for all use cases and does not necessarily conform to any standard.
* For more information on standards and best practices, see PHP Standards Recommendations.
*
* @link https://www.php-fig.org/psr/
*/
<?php
/**
* This file is the entry point to our project
*/
require_once __DIR__ . '/autoload.php';
$john_doe = new \Acme\ExampleProject\Mammals\Human;
var_dump( $john_doe );
<?php
namespace Acme\ExampleProject\Mammals;
class Human {
/** etc **/
}
<?php
/**
* If the $class being instantiated is within the namespace `Acme\ExampleProject`, then find the correct
* file within our `src` directory
*/
spl_autoload_register( function( $class ) {
# namespace prefix that we will use for autoloading the appropriate classes and ignoring others
$prefix = 'Acme\\ExampleProject\\';
# base directory where our project's files reside
$base_dir = __DIR__ . '/src/';
/**
* Does the class being called use our specific namespace prefix?
*
* - Compare the first {$len} characters of the class name against our prefix
* - If no match, move to the next registered autoloader in the system (if any)
*/
# character length of our prefix
$len = strlen( $prefix );
# if the first {$len} characters don't match
if ( strncmp( $prefix, $class, $len ) !== 0 ) {
return;
}
# get the name of the class after our prefix has been peeled off
$class_name = str_replace( $prefix, '', $class );
/**
* Perform normalizing operations on the namespace/class string in order to get the file name to be required
*
* - Replace namespace separators with directory separators in the class name
* - Prepend the base directory
* - Append with .php
*/
$file = $base_dir . str_replace('\\', '/', $class_name ) . '.php';
# require the file if it exists
if( file_exists( $file ) ) {
require $file;
}
}); # end: spl_autoload_register()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment