Moin!
autoload.php
<?php
function __autoload($strClassName){
echo $strClassName;
}
?>
Dein Autoloader wird verhindern, dass der obere Code funktioniert, weil er die Klasse nicht lädt... Das nur am Rande.
> foo.php
Diese Klasse heißt in Langform: \Projekt\Module\foo\foo
> ~~~php
<?php
> namespace Projekt\Module\foo;
> class foo{
> public function run(){ }
> }
> ?>
bar.php
Und diese heißt in Langform: \Projekt\Module\foo\bar
<?php
namespace Projekt\Module\foo;
class bar{
public function run(){ }
}
?>
Und mit diesen Definitionen schauen wir den Code an:
> ~~~php
<?php
> namespace Projekt;
> use Projekt\Module\foo;
> require_once('autoload.php');
> $foo = new foo(); // Projekt\Module\foo
> $bar = new bar(); // Projekt\bar
> ?>
Du gehst in den Namespace \Projekt - alle Klassen, die du jetzt benutzt, müssen entweder voll qualifiziert sein mit Backslash, oder relativ adressiert sein ausgehend von diesem Namespace, oder importiert sein mit "use", oder echt in diesem Namespace definiert werden.
"use Projekt\Module\foo" -> ist eine Fehlerquelle. Du importierst den ganzen Namespace als Alias-Namespace "foo" in den aktuellen Namespace.
Da deine Klasse \Projekt\Module\foo\foo heißt, kannst du sie nach diesem Use als "foo\foo" ansprechen, aber nicht als "foo". Denn der Alias vom "use" muss verwendet werden.
Würdest du die Klasse direkt als "foo" ansprechen wollen, müsstest du sie mit einem "use \Projekt\Module\foo\foo" importieren. Dann importierst du aber die Klasse "bar" nicht mehr.
Wieso erhalte ich da völlig verschiedene Angaben?
Wäre schön, wenn du deine Ausgaben deutlich kennzeichnen würdest.
Mir ist überhaupt nicht klar wie ich das nutzen kann, dass sich gleiche Klassennamen nicht beissen. Wenn ich 2 identische Dateien/Klassen in die Ordner Projekt\Module\foo und Projekt\Module\bar kopiere, wie sprech ich die denn überhaupt an? Beim autoloader kommt offenbar nur noch der namespace und nicht mehr der Klassenname an. Ich verstehe es nicht :(
Der Autoloader kriegt immer den kompletten Namespace plus Klassennamen. Aber wenn du dein Use falsch benutzt und dann die falsche Klasse instanziierst, sieht es natürlich so aus, als würde der Autoloader nur den Namespace nutzen.
Wenn du was testest, ist es immer eine ganz schlechte Idee, zwei unterschiedliche Dinge mit dem gleichen String zu versehen. Hier also Namespace-Namensteil "foo" und Klassenname "foo". Hättest du das mit "NSfoo" und "KlasseFoo" probiert, wäre es dir sofort aufgefallen.
- Sven Rautenberg