PHP Klassen automatisch einbinden (namespace - autoloader)

Steusi

Nasenbär
Hallo zusammen,

was mich bei PHP schon immer gestört hat ist das ständige Einbinden von Dateien, bei anderen Programmiersprachen geht es so schön einfach. Deshalb wollte ich es endlich einmal lernen, aber verzweifle gleich am Anfang.

Ich habe mir folgende Struktur erstellt:

/index.php
/autoloader.php // läd klassen
/library/db/sqlConnect.php // abstrakte Klasse
/library/db/ociConnect.php // erbt von sqlConnect
/library/helper/validator.php

Sobald ich namespace setze damit die Klassen sich finden, klappt nichts :(
Oder genügen die namespaces nicht, damit ociConnect.php die Klasse sieht, von der es erbt?

Gibt es für den autoloader eine fertige universale Klasse, die sich an der Ordnerstruktur = Namespace orientiert?
Ich meine beim Zend Framework klappt auch alles auf magische Art und weise, aber da habe ich beim autoloader den Pfaden verloren.

Ich möchte einfach in der Klasse mit "use" den Namespace angeben, wo er gucken muss und dann soll die Auflösung automatisch passieren.
Wie kann ich dies realisieren?


index.php
PHP:
require_once 'autoloader.php';

autoloader.php
PHP:
class autoloader {
    public static $loader;
    private static $basicDir = null;

    public static function init()
    {
        if (self::$loader == NULL)
            self::$loader = new self();

        return self::$loader;
    }

    public function __construct()
    {
        spl_autoload_register(array($this,'library'));
    }

    public function library($class)
    {
        if (self::$basicDir === null){
            self::$basicDir = dirname (__FILE__);
        }

        // TODO: ****
        $path = self::$basicDir .
                DIRECTORY_SEPARATOR .
                'library' .
                // __Namespace__
                $class .
                '.php';

        self::basicRoutine($class,$path);
    }


    private static function basicRoutine($class,$path){

        if (strpos ($class, '.') !== false ||
            strpos ($class, '/') !== false ||
            strpos ($class, '\\') !== false ||
            strpos ($class, ':') !== false) {

            return;
        }
        if(!file_exists($path)) return;
        include_once $path;
    }
}

autoloader::init();

sqlConnect.php
PHP:
namespace library\db;

abstract class sqlConnection {
    /**
     * The active connection
     *
     * @var object - connection to database
     */
    protected $conn;

//...

ociConnect.php
PHP:
namespace library\db;

class oracleConnection extends sqlConnection {
 //...

validator.php
PHP:
namespace library\helper;

use library\db;

class sqlValidator {

    /**
     * @var sqlConnection
     */
    private $sqlConnection = null;

    /**
     * @param sqlConnection
     */
    public function setSqlConnection(sqlConnection $sqlConnection)
    {
        $this->sqlConnection = $sqlConnection;
    }

 private function _validate(){

        $master_con = clone $this->getSqlConnection();
// ...

Leider klappt das nicht und was mich im Editor wundert ist, das mein $master_con keine Autovervollständigung mehr anzeigt, kann ich ihn über PHPDoc dazu irgendwie zwingen, damit er weiß von welchem Typ es ist. (Verwende PHPStorm 7)

Also er setzt die Methoden um, nur zeigt er sie nicht an. Wichtiger ist mir aber das sich die Klassen automatisch "finden", nur weiß ich nicht genau wie der autoloader erstellt werden muss dafür.

Ich hoffe jemand hat einen Rat.

Danke
 

Neue Beiträge

Zurück