Autocarga de clases

Muchos desarrolladores que escriben aplicaciones orientadas a objetos crean un fichero fuente por definición de clase. Uno de los mayores inconvenientes de este método es tener que escribir una larga lista de inclusiones de ficheros de clases al inicio de cada script: una inclusión por clase.

La función spl_autoload_register() registra un número cualquiera de cargadores automáticos, lo que permite a las clases y a las interfaces ser automáticamente cargadas si no están definidas actualmente. Al registrar autocargadores, PHP da una última oportunidad de incluir una definición de clase o interfaz, antes de que PHP falle con un error.

Cualquier construcción similar a las clases puede ser autocargada de la misma manera. Esto incluye las clases, interfaces, traits y enumeraciones.

Precaución

Anterior a PHP 8.0.0, era posible utilizar __autoload() para autocargar las clases y las interfaces. Sin embargo, es una alternativa menos flexible a spl_autoload_register() y __autoload() está obsoleto a partir de PHP 7.2.0, y eliminado a partir de PHP 8.0.0.

Nota:

spl_autoload_register() puede ser llamada varias veces para registrar varios autocargadores. Lanzar una excepción desde una función de autocarga, interrumpirá este proceso y no permitirá que las funciones de autocarga siguientes sean ejecutadas. Por esta razón, lanzar excepciones desde una función de autocarga es fuertemente desaconsejado.

Ejemplo #1 Ejemplo de autocarga

Este ejemplo intenta cargar las clases MiClase1 y MiClase2, respectivamente desde los ficheros MiClase1.php y MiClase2.php.

<?php
spl_autoload_register
(function ($class_name) {
include
$class_name . '.php';
});

$obj = new MiClase1();
$obj2 = new MiClase2();
?>

Ejemplo #2 Otro ejemplo de autocarga

Este ejemplo intenta cargar la interfaz ITest.

<?php

spl_autoload_register
(function ($name) {
var_dump($name);
});

class
Foo implements ITest {
}

/*
string(5) "ITest"

Fatal error: Interface 'ITest' not found in ...
*/
?>

Ejemplo #3 Uso del autoloader de Composer

» Composer genera un fichero vendor/autoload.php configurado para cargar automáticamente los paquetes gestionados por Composer. Al incluir este fichero, estos paquetes pueden ser utilizados sin trabajo adicional.

<?php
require __DIR__ . '/vendor/autoload.php';

$uuid = Ramsey\Uuid\Uuid::uuid7();

echo
"Nuevo UUID generado -> ", $uuid->toString(), "\n";
?>

add a note

User Contributed Notes 5 notes

up
108
jarret dot minkler at gmail dot com
16 years ago
You should not have to use require_once inside the autoloader, as if the class is not found it wouldn't be trying to look for it by using the autoloader.

Just use require(), which will be better on performance as well as it does not have to check if it is unique.
up
65
str at maphpia dot com
8 years ago
This is my autoloader for my PSR-4 clases. I prefer to use composer's autoloader, but this works for legacy projects that can't use composer.

<?php
/**
* Simple autoloader, so we don't need Composer just for this.
*/
class Autoloader
{
public static function
register()
{
spl_autoload_register(function ($class) {
$file = str_replace('\\', DIRECTORY_SEPARATOR, $class).'.php';
if (
file_exists($file)) {
require
$file;
return
true;
}
return
false;
});
}
}
Autoloader::register();
up
28
toi]n[enkayt[attaat]gmaal.com
5 years ago
Autoloading plain functions is not supported by PHP at the time of writing. There is however a simple way to trick the autoloader to do this. The only thing that is needed is that the autoloader finds the searched class (or any other autoloadable piece of code) from the files it goes through and the whole file will be included to the runtime.

Let's say you have a namespaced file for functions you wish to autoload. Simply adding a class of the same name to that file with a single constant property is enough to trigger the autoloader to seek for the file. Autoloading can then be triggered by accessing the constant property.

The constant could be replaced by any static property or method or by default constructor. However, I personally find a constant named 'load' elegant and informative. After all this is a workaround. Another thing to keep in mind is that this introduces an unnecessary class to the runtime. The benefit of this is that there is no need to manually include or require files containing functions by path which in turn makes code maintaining easier. Such behaviour makes it easier to alter the project structure since manual includes need not to be fixed. Only the autoloader needs to be able to locate the moved files which can be automated.

A code file containing functions.
/Some/Namespace/Functions.php
<?php
namespace Some\Namespace;

class
Functions { const load = 1; }

function
a () {
}

function
b () {
}
?>

Triggering autoloading of the file containing functions.
main.php
<?php
\Some\Namespace\Functions
::load;

a ();
b ();
?>
up
22
Anonymous
15 years ago
It's worth to mention, if your operating system is case-sensitive you need to name your file with same case as in source code eg. MyClass.php instead of myclass.php
up
3
kalkamar at web dot de
16 years ago
Because static classes have no constructor I use this to initialize such classes.
The function init will (if available) be called when you first use the class.
The class must not be included before, otherwise the init-function wont be called as autoloading is not used.

<?php
function __autoload($class_name)
{
require_once(
CLASSES_PATH.$class_name.'.cls.php');
if(
method_exists($class_name,'init'))
call_user_func(array($class_name,'init'));
return
true;
}
?>

I use it for example to establish the mysql-connection on demand.

It is also possilbe do add a destructor by adding this lines to the function:
<?php
if(method_exists($class_name,'destruct'))
register_shutdown_function(array($class_name,'destruct'));
?>
To Top