__autoload

Kalito

Erfahrenes Mitglied
hallo,

habe eine Fragen, bzgl. der __autoload-Funktion.

Wie muss ich die Funktion schreiben, das ich nicht jedes mal die Klasse bzw. den Pfad zur Klasse händig in der Funktion bekannt machen muss, sondern, wenn ich die Klasse erstellt habe, dies auch sofort nutzen kann.

Danke und Gruß
 
hallo,

habe eine Fragen, bzgl. der __autoload-Funktion.

Wie muss ich die Funktion schreiben, das ich nicht jedes mal die Klasse bzw. den Pfad zur Klasse händig in der Funktion bekannt machen muss, sondern, wenn ich die Klasse erstellt habe, dies auch sofort nutzen kann.

Danke und Gruß
Zum Bleistift, kann man das so machen:
PHP:
function __autoload( $class )
{
    if ( !class_exists( $class ) && !interface_exists( $class ) )
    {
        $paths = array(
            '/Pfad/zu/den/Klassen/class.'.$class.'.php',
            '/Pfad/zu/den/Interfaces/interface.'.$class.'.php',
            '/Pfad/zu/den/abstrakten/Klassen/abstract.'.$class.'.php'
        );

        foreach ( $paths as $file )
        {
            if ( is_file( $file ) )
            {
                require $file;
                return true;
            }
        }

        die( "<h1>Error: Class '<em>$class</em>' not found!</h1>" );
    }

    return true;
}

Oder auch als Klasse in dieser Form:
PHP:
/**
 * Class to load unloaded classfiles.
 *
 * @abstract
 * @author Rainer Schulz <admin@raischblog.de>
 * @link http://raischblog.de
 * @copyright 2011 - Rainer Schulz
 * @license CC BY-NC-SA 3.0 <http://creativecommons.org/licenses/by-nc-sa/3.0/>
 * @version 2.2 02/12/2011 14:13
 */
abstract class AutoLoad
{
    private static $arrPath = null;
    private static $arrExt  = null;

    public static function init( $strClassPath,
                                 $strInterfacePath,
                                 $strLibraryPath,
                                 $strModelPath,
                                 $strViewPath,
                                 $strControllerPath,
                                 $strRepositoryPath )
    {
        self::$arrPath = array (
            'class'      => $strClassPath,
            'interface'  => $strInterfacePath,
            'library'    => $strLibraryPath,
            'model'      => $strModelPath,
            'view'       => $strViewPath,
            'controller' => $strControllerPath,
            'repository' => $strRepositoryPath
        );

        self::$arrExt = array(
            'class'     => '.class.php',
            'interface' => '.interface.php',
            'library'   => '.library.php'
        );

        spl_autoload_register( 'AutoLoad::loadClass' );
        spl_autoload_register( 'AutoLoad::loadLibrary' );
        spl_autoload_register( 'AutoLoad::loadController' );
        spl_autoload_register( 'AutoLoad::loadModel' );
        spl_autoload_register( 'AutoLoad::loadRepository' );
        spl_autoload_register( 'AutoLoad::loadView' );
        spl_autoload_register( 'AutoLoad::loadInterface' );
    }

    public static function loadClass( $strClass )
    {
        return self::registerClass(
            self::$arrPath['class'].$strClass.self::$arrExt['class']
        );
    }

    public static function loadInterface( $strClass )
    {
        return self::registerClass(
            self::$arrPath['interface'].$strClass.self::$arrExt['interface']
        );
    }

    public static function loadLibrary( $strClass )
    {
        return self::registerClass(
            self::$arrPath['library'].$strClass.self::$arrExt['library']
        );
    }

    public static function loadModel( $strClass )
    {
        return self::registerClass(
            self::$arrPath['model'].$strClass.self::$arrExt['class']
        );
    }

    public static function loadView( $strClass )
    {
        return self::registerClass(
            self::$arrPath['view'].$strClass.self::$arrExt['class']
        );
    }

    public static function loadController( $strClass )
    {
        return self::registerClass(
            self::$arrPath['controller'].$strClass.self::$arrExt['class']
        );
    }

    public static function loadRepository( $strClass )
    {
        return self::registerClass(
            self::$arrPath['repository'].$strClass.self::$arrExt['class']
        );
    }

    private static function registerClass( $strFile )
    {
        if ( is_file( $strFile ) )
        {
            require $strFile;
            return true;
        }

        return false;
    }
}

Starten kannst Du die Klasse so:
PHP:
AutoLoad::init(
    PATH_TO_CLASSES,
    PATH_TO_INTERFACES,
    PATH_TO_LIBRARIES,
    PATH_TO_MODELS,
    PATH_TO_VIEWS,
    PATH_TO_CONTROLLERS,
    PATH_TO_REPOSITORIES
);

Gruß
 
Zurück