Raisch
extraordinary bit
Hallo Community,
ich möchte euch hier meine 3 Varianten für den Autoload von Klassen vorstellen und suche Meinungen/Erfahrungen.
Was ist besser? Warum ist es besser? Gibt es noch andere Möglichkeiten?
Fragen über Fragen, aber hier mal zu meinen Varianten:
Variante 1 __autoload()
Variante 2 Autoloadklasse mit manueller Einbindung
Variante 3 Autoloadklasse mit Einbindung über spl_autoload()
Viel Code wenig Text, wenn noch Fragen sind... ich höre.
Gruß
ich möchte euch hier meine 3 Varianten für den Autoload von Klassen vorstellen und suche Meinungen/Erfahrungen.
Was ist besser? Warum ist es besser? Gibt es noch andere Möglichkeiten?
Fragen über Fragen, aber hier mal zu meinen Varianten:
Variante 1 __autoload()
PHP:
function __autoload( $class ) {
if ( !class_exists( $class ) && !interface_exists( $class ) ) {
$class = strtolower( $class );
$paths = array(
'./.include/class/'.$class.'.class.php',
'./.include/class/abstract/'.$class.'.abstract.php',
'./.include/class/interface/'.$class.'.interface.php'
);
foreach ( $paths as $file ) {
if ( file_exists( $file ) && is_file( $file ) ) {
require_once $file;
return true;
}
}
die( "<h1>Error: Class '<em>$class</em>' not found!</h1>" );
}
return true;
}
Variante 2 Autoloadklasse mit manueller Einbindung
PHP:
abstract class RsAutoLoad
{
private static $path = null;
private static $ext = null;
public static function init()
{
$root = $_SERVER['DOCUMENT_ROOT'].'/foo/bar/';
self::$path = array (
'cls' => $root.'.include/class/',
'abs' => $root.'.include/class/abstract/',
'itf' => $root.'.include/class/interface/'
);
self::$ext = array (
'cls' => '.class.php',
'abs' => '.abstract.php',
'itf' => '.interface.php'
);
spl_autoload_register( 'RsAutoLoad::loadClass' );
spl_autoload_register( 'RsAutoLoad::loadAbstact' );
spl_autoload_register( 'RsAutoLoad::loadInterface' );
}
public static function loadClass( $class )
{
return self::registerClass(
$class, self::$path['cls'].strtolower( $class ).self::$ext['cls']
);
}
public static function loadAbstact( $class )
{
return self::registerClass(
$class, self::$path['abs'].strtolower( $class ).self::$ext['abs']
);
}
public static function loadInterface( $class )
{
return self::registerClass(
$class, self::$path['itf'].strtolower( $class ).self::$ext['itf']
);
}
private static function registerClass( $class, $path )
{
if ( file_exists( $path ) && is_file( $path ) ) {
require_once $path;
return true;
}
return false;
}
}
RsAutoLoad::init();
Variante 3 Autoloadklasse mit Einbindung über spl_autoload()
PHP:
abstract class RsAutoLoad
{
private static $path = null;
private static $ext = null;
public static function init()
{
$root = $_SERVER['DOCUMENT_ROOT'].'/foo/bar/';
self::$path = array (
'cls' => $root.'.include/class/',
'abs' => $root.'.include/class/abstract/',
'itf' => $root.'.include/class/interface/'
);
self::$ext = array (
'cls' => '.class.php',
'abs' => '.abstract.php',
'itf' => '.interface.php'
);
spl_autoload_register( 'RsAutoLoad::loadClass' );
spl_autoload_register( 'RsAutoLoad::loadAbstact' );
spl_autoload_register( 'RsAutoLoad::loadInterface' );
}
public static function loadClass( $class )
{
self::feedSplAutoLoad( self::$path['cls'], self::$ext['cls'], $class );
}
public static function loadAbstact( $class )
{
self::feedSplAutoLoad( self::$path['abs'], self::$ext['abs'], $class );
}
public static function loadInterface( $class )
{
self::feedSplAutoLoad( self::$path['itf'], self::$ext['itf'], $class );
}
private static function feedSplAutoLoad( $path, $ext, $class )
{
//set_include_path( $path.PATH_SEPARATOR.get_include_path() );
spl_autoload_extensions( $ext );
spl_autoload( $path.$class );
}
}
RsAutoLoad::init();
Viel Code wenig Text, wenn noch Fragen sind... ich höre.
Gruß