2016-07-15 3 views
0

Ich habe so etwas wie die folgenden:Wie können zwei Klassen-Dateien gleichzeitig in PHP eingebunden werden, so dass ihre Methoden untereinander zugänglich sind?

include 'firstclass.php'; 
include 'secondclass.php'; 

firstclass.php:

class First { 
    public static function foo() { 
    Second::bar(); 
    } 
    public static function oof() { 
    // ... 
    } 
} 

secondclass.php:

class Second { 
    public static function bar() { 
    First::oof(); 
    } 
} 

Wie man sehen kann, muss ich von den Methoden der Second Klasse zugreifen die First und umgekehrt.

Wie kann ich beide einschließen, so dass sie von den Klassen des jeweils anderen zugänglich sind?

+1

Schauen Sie sich Autoloading der Klassen: http://php.net/manual/en/language.oop5.autoload.php – Jaime

+0

@Jaime Ah danke, das hat mir geholfen. Vielleicht möchten Sie mehr Informationen in eine Antwort stecken? – think123

Antwort

4

Sie haben zwei Möglichkeiten:

sie in der gleichen Datei Put

Die einfachste schnellste Lösung ist, beide Klassen in der gleichen Datei zu setzen. PHP analysiert die gesamte Datei vor der Ausführung, so dass die Klassen die Methoden des jeweils anderen verwenden können. Dies funktioniert, aber die professionellere und skalierbare Lösung ist die andere Option.

Verwenden autoloading

PHP ermöglicht es Anweisungen zu geben, wo sie suchen müssen, wenn Sie eine unbekannte Klasse aufrufen. Dies wird Autoloading genannt().

Haben Sie ein Initialisierungsskript, das vor allen Skripts ausgeführt wird. Dies geschieht am einfachsten durch Setzen von auto_prepend_file=/path/to/init.php in php.ini (details). Sobald Sie Setup ein solches Skript haben, können Sie das automatische Laden von Anweisungen, um es

//function called whenever you use an unknown class. It will 
//be passed the name of your class 
function my_autoloader($class) { 
    include __DIR__ .'/classes/' . $class . '.class.php'; 
} 

spl_autoload_register('my_autoloader'); 

Der obige Code funktionieren würde, wenn Ihre Klassen sind in einem Unterverzeichnis classesinit.php, und verwenden Sie die Erweiterung .class.php hinzufügen. So, um es mit Ihrem Beispiel funktioniert, die Verzeichnisstruktur sein müßte

init.php 
classes/ 
    First.class.php 
    Second.class.php 

Anpassungen vornehmen, um den Autoloader als angemessen.

+0

Da es ein 'File/Directory' ist, werde ich' require_once' nicht zweimal aufrufen? – RoCk

+0

@RoCk 'require_once' wird nie aufgerufen. Autoloading ist anders. PHP analysiert die gesamte Datei, bevor sie ausgeführt wird. Wenn es auf eine Klasse stößt, die es nicht kennt, wird es "my_autoloader" verwenden, um es zu finden und in den Speicher zu laden. Wenn Sie eine Klasse aufrufen, die bereits geladen wurde, wird sie nicht erneut geladen ('my_autoloader' wird nicht für bekannte Klassen aufgerufen). – BeetleJuice

Verwandte Themen