2010-02-28 8 views
6

Beim Erweitern von Klassen in Java wird die Mehrdeutigkeit von Klassennamen durch die Verwendung von qualifizierten Paketnamen in den Importanweisungen vermieden.Erweitern der Klassen in PHP

Zum Beispiel: Sagen wir, ich möchte, dass mein Controller den MultiActionController von Spring erweitert - ich werde das Gleiche aus dem Standard-Spring-Paket importieren. Das hindert mich auch daran, Mikes oder Perrys MultiActionController zu erweitern, da ich MultiActionController nicht aus ihren Paketen importiert habe.

Ähnlich in PHP, sagen wir haben 10 Klassen in 10 verschiedenen Bibliotheksordnern, die alle MultiActionController genannt werden.

Wenn ich schreibe:

class MyController extends MultiActionController { 
    function __construct() { 
     parent::__construct(); 
    } 
} 

Wie kann ich feststellen, PHP, welche MultiActionController (aus dem Ordner), von zu verlängern?

+0

gibt es einen Grund, warum Ihr beschränkt auf PHP4 verwenden würde? Wenn Sie PHP5 und Version 5.3 oder besser verwenden, erhalten Sie viel bessere Beispiele mit Namensräumen. –

+0

Bin nicht. SO automatisch das, ich weiß nicht warum. Ich bin auf PHP 5.2.8 (das ist, was mein Host anbietet). –

+0

Ich habe Ihre Frage bearbeitet, um das "php4" -Tag zu entfernen, und ersetzen Sie es durch "php5", so sind die Dinge klar :-) –

Antwort

1

PHP erweitert die von Ihnen eingeschlossene Klasse um eine Include-Anweisung.

Zum Beispiel, sagen, dass Sie eine Klasse foo in Datei bar.php erklärt haben:

class Foo { 
    // methods and fields 
} 

Dann in einem anderen fie:

include 'bar.php'; 
class Aardvark extends Foo { 
    // this class will extend the class Foo in file bar.php 
} 
+0

Danke, was für ein Idiot ich gewesen bin. –

2

Es hängt davon ab, welche Sie umfassen. PHP wird nicht zulassen, eine Klasse mit dem gleichen Namen neu definieren, so knapp oberhalb der Klassendefinition (ändert die Dateinamen und Ihr Software-Layout zu passen) schließt ein:

include('../includes/Spring/MultiActionController.php'); 

class MyController extends MultiActionController { 
    .... 
} 
+0

Danke, was für ein Trottel ich gewesen bin. ;) –

1

Sie müssen die Datei schließen die Klasse zu halten, mit einer banalen include() Aussage:

include('lib/controllers/MultiAction.php'); 

Dann können Sie es erweitern!

+0

Danke, was für ein Trottel ich gewesen bin. –

+0

Jeder muss lernen! Übrigens sollten Sie über den Unterschied zwischen 'include()', 'require()' und 'require_once()' lesen! include() wird einen nicht-fatalen Fehler verursachen, wenn php-Datei fehlt, require() verhält sich genauso, aber mit einem schwerwiegenden Fehler, und require_once vermeidet, dass die php-Datei mehrfach aus verschiedenen Skripten abgerufen wird! Kann hier prüfen => http://it.php.net/require_once –

7

Mehrere Klassen mit dem gleichen Namen führen irgendwann zu Problemen: Sie können nicht zwei Klassen mit demselben Namen während der Ausführung eines Skripts einschließen - Sie erhalten einen Fatal Error.

Was normalerweise getan wird, in PHP (vor PHP 5.3 und Namespaces, mindestens) ist, den Namen der Bibliothek und/oder das "Paket" in den Klassennamen aufzunehmen.

Sie könnten beispielsweise einen Klassennamen MyLibrary_Package_MultiActionController und einen anderen OtherLib_Blah_MultiActionController haben.


Dann, was ist in der Regel, dass die Klassennamen verwendet getan „Karte“ es auf Verzeichnisse und Dateien, die ‚_‘ durch ‚/‘ und das Hinzufügen von .php am Ende der letzten Stufe zu ersetzen - dieses Wesen oft unter Verwendung der autoloading feature of PHP, um zu vermeiden, eine enorme Menge von Direktiven schreiben zu müssen.

Zum Beispiel sollte eine Klasse mit dem Namen MyLibrary_Package_MultiActionController in MyLibrary/Package/MultiActionController.php gespeichert werden.


Als Nebenbemerkung: Sie verwendeten das Tag "php4", in Ihrer Frage ...Wenn Sie tatsächlich PHP 4 verwenden, sollten Sie nicht vergessen, dass es alt ist, nicht mehr gepflegt (Nicht einmal für sicherheitsrelevante Probleme), und das PHP 5 ist wirklich der Weg zu gehen!

In der Tat können Sie mit PHP 4 nicht viel über objektorientierte Programmierung tun; die objektorientierten Sachen in PHP 4 waren wirklich grundlegende ...

(Material wie die automatische Laden, den ich über ein paar Absatz früher geschrieben hätte existiert nicht in PHP 4 - gleiches für public/private/protected und viele andere OO-bezogene Dinge ...)

+0

Thx für die Antwort. Ich bin auf PHP 5.2.8 (siehe meine Antwort oben). –

+0

OK über PHP 5.2 vs PHP 4: das ist eine gute Nachricht :-) –

0

I namaspaces

namespace package_products_multicontroller { 
include("/packages/products/multicontroller.php"); 
} 

class MyController extends package_products_multicontroller\MultiActionController { 
    function __construct() { 
     parent::__construct(); 
    } 
} 
+0

Dies scheint am klarsten zu sein (lies: 'am eindeutigsten') (obwohl ein bisschen ausführlich, wenn ich es wagen darf, das zu sagen). –