2012-04-09 8 views
1

Ich versuche einen Weg zu finden, um eine Klasse mit einem Closure "neu zu deklarieren". Dies ist, was ich bisher habe:Klasse mit dynamischem Namespace redefinieren


Ich habe zwei einfache Klassen, die identisch sind, mit Ausnahme des Namespace. Der Namensraum in test2.php heißt "bla" und in new.php heißt er "newname". Ansonsten sind sie genau gleich.

namespace bla; //test2.php 
class A 
{ 
    public function __construct() 
    { } 

    public function bla() 
    { 
     echo '[A bla]'; 
    } 
} 

include ("new.php"); 
include ("test2.php"); 

use newname\A as A; // <-- dynamic 

$a = new A(); 
$a->bla(); 

Also dieses Stück Code führt einfach die Methode aus der Klasse 'new.php' anstelle der Klasse in 'test2.php'. Das ist genau das, was ich brauche. Aber mein Problem ist der letzte Teil des Codes. Normalerweise hätte ich einen Namespace verwendet:

$a = new bla\A(); //Defined in 'test2.php' 
$a->bla(); 

Aber wegen der ‚Verwendung als‘ Aussage muss ich auf diese Zeile ändern:

$a = new A(); //Defined in 'test2.php' 
$a->bla(); 

Also ohne einen Namespace infront „A() ".

Gibt es eine Möglichkeit, den Namespace "bla \ A()" zu behalten (der in test2.php definiert ist), aber dass er immer noch die Methode von "new.php" aufruft ??

+1

Btw, nicht alles, was 'use' darin hat, ist ein Verschluss. Closures sind anonyme Funktionen, die Variablen aus dem äußeren Geltungsbereich freigeben. Die 'Verwendung' würde in diesem Fall ein Alias ​​oder Import oder etwas in dieser Richtung heißen :) – NikiC

+0

Wenn die zwei Klassen identisch sind, warum brauchen Sie dann zwei Klassen? DRY http://en.wikipedia.org/wiki/Don%27t_repeat_yourself – GordonM

Antwort

1

In diesem Fall aus jeder Klasse zu rufen, sollten Sie =>

$bla = new bla/A(""); 
$bla->bla();  // to call from bla.php 

und zweite Klasse schreiben

$newname = new newname/A(""); 
$newname->something(); // to call from newname.php 

und es wird funktionieren, müssen Sie nicht mit der Nutzung Übermüdung Skript benötigen Stichwort

auch ist es gute Praxis Klassen mit Namespaces in einer Datei zu schreiben, wie so => ​​

namespace bla{ 
    class A{ 
     // content 
    } 
} 

namespace newname{ 
    class A{ 
     // content 
    } 
} 
+0

Ich weiß, ich könnte es so machen. Aber der Grund, warum ich die Klasse 'redeclare' will, ist, weil ich die alte bla \ A() Klasse 'patchen' möchte. Also ich möchte bla \ A() aufrufen können, aber es sollte die Methode von newname \ A() ausführen. Die Technik wird Affe-Patching genannt, daher weiß ich, dass dies möglich ist. Nur nicht genau, wie genau. – w00

+0

Entschuldigung, aber ich kann nicht die Frage bekommen, was Sie tun werden :( – tnanoba

1

Wie es in Kommentaren heißt, handelt es sich nicht um ein "Closure" -Thema, sondern nur um dynamisches Namespace-Thema.

Ich glaube nicht, dass Sie das Schlüsselwort use dynamisch verwenden können. Allerdings ist PHP eine dynamische Sprache, können Sie wählen, dynamisch, welche Klasse Sie mit Meta-Programmierung wollen:

$wantedClass = 'myWantedNamespace\MyWantedClass'; 
$instance = new $wantedClass();