contao/core — pull request #4526 by tristanlins (2012-07-13 12:43:27+00:00)
Title: Echte Namespaces für Contao Extensions 2

Nachdem @aschempp und ich ein paar Stunden über meinen [ersten Vorschlag für echte Namespaces](https://github.com/contao/core/pull/4514) diskutiert hatten, gibt es jetzt eine aktualisierte Version.

Die Idee, anstatt dem `_vendor_` Part im Namespace, fügen wir einen virtuellen Namespace-Teil hinzu.
Ich habe mich für `Runtime\` entschieden, @aschempp hatte zwar `Contao\` Vorgeschlagen, aber `Contao\` würde einen Konflikt mit dem Contao Framework verursachen, der auch unter dem Namespace `Contao\` firmiert. (Außerdem hätten wir dann beim Framework Contao doppelt im Namespace, z.B. `Contao\Contao\Controller`).
Außerdem macht der Begriff `Runtime` deutlich, dass es sich hier um etwas handelt, das nur zur Laufzeit existiert und vermutlich niemals von einem Entwickler als Namespace genutzt werden wird.

Es ist jetzt also so, dass man beim benutzen einer NS-Klasse, immer `Runtime\` voraus stellen muss, z.B.: `Runtime\Namespaces\NamespaceClass` anstelle von `Namespaces\NamespaceClass`.
Sollte man doch mal das `Runtime\` vergessen, erinnert der ClassLoader einen daran, in dem er eine Warning triggert.

**Vorteil dieser Lösung**: Es ist kein `_vendor_` Part mehr im Namespace der entfällt.

**Nachteil dieser Lösung**: Man muss beim Überschreiben einer Klasse explizit angeben, welche Klasse man überschreiben will.

**Variante 1**: von Hand in der autoload.php:

In der ursprünglich definierenden Erweiterung wird definiert:

```php
'Namespaces\NamespaceClass',
));
```

In der überschreibenden Erweiterung wird definiert:

```php
'Namespaces\Extension\NamespaceClass',
));
```

Das Mapping besagt, dass die Klasse `Runtime\Namespaces\NamespaceClass` ein Alias auf `Namespaces\Extension\NamespaceClass` darstellt. Die Klasse `Namespaces\Extension\NamespaceClass` kann dann wiederum `Namespaces\NamespaceClass` extenden, das Original bleibt also wieder erhalten.

Eine Beispiel-Implementierung gibt es wieder in den beiden Demo Extensions, die ich für diesen POC aktualisiert habe:
Original: https://github.com/InfinitySoft/contao3-poc-namespaces
Erweitert: https://github.com/InfinitySoft/contao3-poc-namespaces-extension

**Variante 2**: via Annotation:

Ich weiß, @leofeyer mag keine Annotations, aber in diesem Fall bleibt nichts anderes übrig, um dem Autoload-Generator zu sagen, welche Klasse eigentlich überschrieben werden soll.

Das ganze sieht dann so aus:

```php