traits und namespaces

16/05/2013 - 16:10 von Stefan+Usenet | Report spam
Nachdem ich eben erst widerwillig davon ueberzeugt worden bin, dass
Traits nicht mehr tun, als copy/paste-Funktionalitaet
bereitzustellen, kommt schon der naechste Aha-Effekt. In dieser
Kuerze zwar reichlich sinnfrei, aber hoffentlich von der Motivation
her trotzdem einigermassen nachvollziehbar:

-
<?php

namespace {
trait T {
public function t() {
echo get_class($this) . "";
Foo::foo();
}
}
}

namespace N1 {
class C {
use \T;
}

class Foo {
public static function foo() {
echo "N1-foo";
}
}
}

namespace N2 {
class C {
use \T;
}

class Foo {
public static function foo() {
echo "N2-foo";
}
}
}

namespace {
$n1 = new N1\C();
$n1->t();

$n2 = new N2\C();
$n2->t();
}

?>
-

Ergebnis:

| N1\C
|
| Fatal error: Class 'Foo' not found in /home/sfroehli/test.php on line 7

Wenn ich nun in einem Trait andere Klassen aus dem selben
Namensraum wie die Traegerklasse aufrufen will, und das ganze in
verschiedenen Namensraeumen funktionieren soll, muss ich mich
tatsaechlich mit String-Operationen auf get_class($this)
herumschlagen? Das ist irgendwie witzlos.

Servus,
Stefan

http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich
Offizieller Erstbesucher(TM) von mmeike

Vertiert? Vertierter als Stefan!? Das wàre der Hit!
(Sloganizer)
 

Lesen sie die antworten

#1 Christoph Becker
17/05/2013 - 22:14 | Warnen spam
Stefan Froehlich wrote:
Nachdem ich eben erst widerwillig davon ueberzeugt worden bin, dass
Traits nicht mehr tun, als copy/paste-Funktionalitaet
bereitzustellen, kommt schon der naechste Aha-Effekt. In dieser
Kuerze zwar reichlich sinnfrei, aber hoffentlich von der Motivation
her trotzdem einigermassen nachvollziehbar:

-
<?php

namespace {
trait T {
public function t() {
echo get_class($this) . "";
Foo::foo();
}
}
}

namespace N1 {
class C {
use \T;
}

class Foo {
public static function foo() {
echo "N1-foo";
}
}
}

namespace N2 {
class C {
use \T;
}

class Foo {
public static function foo() {
echo "N2-foo";
}
}
}

namespace {
$n1 = new N1\C();
$n1->t();

$n2 = new N2\C();
$n2->t();
}

?>
-

Ergebnis:

| N1\C
|
| Fatal error: Class 'Foo' not found in /home/sfroehli/test.php on line 7

Wenn ich nun in einem Trait andere Klassen aus dem selben
Namensraum wie die Traegerklasse aufrufen will, und das ganze in
verschiedenen Namensraeumen funktionieren soll, muss ich mich
tatsaechlich mit String-Operationen auf get_class($this)
herumschlagen? Das ist irgendwie witzlos.



Was Du hier machen willst, ist die polymorphe Verwendung von Namespaces
durch einen Trait. Das ist aufgrund der dynamischen Natur von PHP zwar
möglich, aber es ist eben kein gutes OO Design.

Eleganter ist es die Foo-Klassen an die C-Klassen zu koppeln. Evtl. ist
es sinnvoll, Foo zur Elternklasse von C zu machen; dann kann in T per
self::foo() die Klassenmethode aufgerufen werden. Oder Du gestaltest Foo
als Trait statt als Klasse. Oder aber Du machst die Foo-Klassen zu
Singletons und aggregierst das Exemplar in der C-Klasse.

Christoph M. Becker

Ähnliche fragen