rfc:splclassloader

This is an old revision of the document!


Request for Comments: SplClassLoader

Introduction

PHP 5 introduced the concept of autoloading classes.

However, many different projects adopted their own approach for class loader. In the mid of 2009, several lead developers started an initiative called PHP Standards Group (aka. Framework Interoperability Group), which is mainly focused on interoperability between different Open Source projects.

After an extensive discussions, group came with the primary interoperability between them, which is formally named as PHP Standards Recommendation #0 (or PSR-0).

PSR-0 focus on a flexible autoloader that could be used or shared between projects, structuring and organizing Object Oriented code. So any project that decides to be PSR-0 compliant just need to follow the defines rules defined in the next topic.

Rules

The following rules must be implemented in order to make a project be compliant to PSR-0:

  • A fully-qualified namespace and class must have the following structure \<Vendor Name>\(<Namespace>\)*<Class Name>
  • Each namespace must have a top-level namespace (“Vendor Name”).
  • Each namespace can have as many sub-namespaces as it wishes.
  • Each namespace separator is converted to a DIRECTORY_SEPARATOR when loading from the file system.
  • Each “\_” character in the CLASS NAME is converted to a DIRECTORY_SEPARATOR. The “\_” character has no special meaning in the namespace.
  • The fully-qualified namespace and class is suffixed with “.php” when loading from the file system.
  • Alphabetic characters in vendor names, namespaces, and class names may be of any combination of lower case and upper case.

Usage Examples

The standards we set here should be the lowest common denominator for painless autoloader interoperability. You can test that you are following these standards by utilizing this sample SplClassLoader implementation which is able to load PHP 5.3 classes.

  • \Doctrine\Common\IsolatedClassLoader
    • /path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php
  • \Symfony\Core\Request
    • /path/to/project/lib/vendor/Symfony/Core/Request.php
  • \Zend\Acl
    • /path/to/project/lib/vendor/Zend/Acl.php
  • \Zend\Mail\Message
    • /path/to/project/lib/vendor/Zend/Mail/Message.php
  • \namespace\package\Class_Name
    • /path/to/project/lib/vendor/namespace/package/Class/Name.php
  • \namespace\package_name\Class_Name
    • /path/to/project/lib/vendor/namespace/package_name/Class/Name.php

Example implementation

function autoload($className)
{
    $className = ltrim($className, '\\');
    $fileName  = '';
    $namespace = '';
    if ($lastNsPos = strripos($className, '\\')) {
        $namespace = substr($className, 0, $lastNsPos);
        $className = substr($className, $lastNsPos + 1);
        $fileName  = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
    }
    $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
 
    require $fileName;
}

Proposal and Patch

The proposal and PHP implementation is already available anywhere through: http://groups.google.com/group/php-standards/web/psr-0-final-proposal Main purpose of this proposal is to suport both PEAR style directory organization and also Namespace directory organization.

A C extension is already available for usage, and can be grabbed at http://github.com/metagoto/splclassloader

Changelog

2010-03-22 Guilherme Blanco: Initial RFC creation.

rfc/splclassloader.1319507152.txt.gz · Last modified: 2017/09/22 13:28 (external edit)