2012-06-27 5 views
7

Sollte ich/require_once die Elternklasse, die ich in PHP bin erweitern?Erfordert das Erweitern einer Elternklasse in PHP die Datei mit der enthaltenen Klasse?

zum Beispiel habe ich eine Klasse namens Shapes

class Shapes { 

} 

Und dann habe ich eine Unterklasse namens

require_once('shapes.php'); 

class Circle extends Shapes { 

} 

Soll ich die Elternklasse verlangen, wenn ich erstreckt bin? oder sollte man einfach die Unterklasse zur übergeordneten Klasse itss erweitern, obwohl sie sich im selben Ordner befinden?

+4

Haben Sie sich das automatische Laden angesehen? http://www.php.net/manual/en/language.oop5.autoload.php –

Antwort

13

Sie müssen etwas tun, damit PHP Ihre Basisklassendefinition sehen kann, bevor es die Kindklasse verarbeiten kann, sonst wird ein fataler Fehler auftreten.

Das ist etwas kann entweder eine manuelle require_once der Basisklasse-Datei oder autoloading (es gibt auch andere Optionen für das automatische Laden, aber spl_autoload_register ist, die Sie verwenden sollten).

Welcher Ansatz verwendet wird, hängt vom Umfang ab: Bei der Codierung eines kleinen Testprojekts ist das Einrichten von Autoloading wahrscheinlich zu viel Aufwand. Aber wie die Code-Basis wird größer und größer ist, wird die automatische Laden attraktiver, weil:

  • es komplexe Quelldatei Auflösungslogik verstecken kann (zB wenn Sie ein konfigurierbares Verzeichnis für die Basisklassen haben, es gibt fortgeschritteneren Szenarien als auch)
  • kann es schrittweise konfiguriert werden: Sie mehrere Autoloader, die als Kette laufen und jedes unabhängiges Modul der Anwendung verwenden können, kann seine unabhängige Autoloader registrieren, die
2

Ja friedlich mit allen anderen koexistiert, Sie haben um es einzuschließen, wenn diese Klasse nicht in derselben Datei deklariert ist.

Auch gab es eine Funktion namens Autoloading Classes, mit dem Sie eine Funktion wie diese erstellen:

function __autoload($class){ 
    require_once('classes/' . $class . '.php'); 
} 

Und es wird automatisch enthalten Klassen, die im bisherigen Umfang nicht zu finden sind

Sie auch kann auch über dieses Feature lesen: autoload_register

1

Sie können auch Composer verwenden, um den Vorgang zu vereinfachen.

Machen composer.json wie diese

{ 
... 
    "autoload": { 
     "psr-4": { 
      "": "src/" 
     } 
    }, 
... 
} 

Get Komponist von https://getcomposer.org/ und composer install laufen. Sie sollten einmal Komponisten automatisch geladen Skript laden wie

require_once __DIR__ . '/vendor/autoload.php'; 

Wenn Sie PHP kleiner als 5.3.0 haben dann __DIR__ mit dirname(__FILE__) ersetzen.

Und legen Sie Ihre Dateien auf src Ordner.Zum Beispiel, wenn Sie die Klasse Acme\Utils\FooBar haben, dann sollte es in src/Acme/Utils/FooBar.php sein.