Wie kann ich eine statische Methode für eine Variablenklasse aufrufen?
Ich versuche, eine Art von Funktion geladen und instanziiert eine Klasse, die aus einer bestimmten variable. So etwas wie dieses:
<?php
function loadClass($class) {
$sClassPath = SYSPATH."/classes/{$class}.php";
if (file_exists($sClassPath)) {
require_once($sClassPath);
$class = $class::getInstance();
}
}
?>
Wenn ich es wie folgt:
<?php
loadClass('session');
?>
Sollte und instanzieren der session Klasse.
BTW: die statische getInstance-Funktion kommt von dieser-code:
<?php
function getCallingClass() {
$backtrace = debug_backtrace();
$method = $backtrace[1]['function'];
$file = file($backtrace[1]['file']);
$line = $file[($backtrace[1]['line'] - 1)];
$class = trim(preg_replace("/^.+?([A-Za-z0-9_]*)::{$method}\(.*$/s", "\\1\\2", $line));
if(! class_exists($class)) {
return false;
} return $class;
}
class Core {
protected static $instances = array();
public static function getInstance() {
$class = getCallingClass();
if (!isset(self::$instances[$class])) {
self::$instances[$class] = new $class();
} return self::$instances[$class];
}
}
?>
Der Sache ist, dass jetzt der Weg, um die Funktionen in einer Klasse ist das denn:
<?php
$session = session::getInstance();
?>
Nun aber, das ich bauen will, in eine Funktion, so dass ich nie wieder zu verwenden, die code-Zeile.
Ich sage nur loadClass('session');
und als ich verwenden können $session->blablablafunction();
InformationsquelleAutor der Frage | 2009-03-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aufruf von statischen Funktionen in einer Variablen der Klasse-name ist offenbar vorhanden in PHP 5.3:
http://php.net/manual/en/language.oop5.static.php
Könnte auf jeden Fall verwenden, dass gerade jetzt mich.
Bis dann kann man nicht wirklich davon ausgehen, dass jede Klasse, die Sie laden ist entworfen, um ein singleton. So lange, wie Sie mit Hilfe von < 5.3 Sie müssen nur die Klasse laden und instanzieren über den Konstruktor:
}
ODER
Nur die Klasse laden kann, ohne dass ein Objekt aus. Rufen Sie dann "::getInstance()" auf diejenigen gedacht singletons, und die "neuen" auf diejenigen, die nicht sind, von außerhalb die loadClass () - Funktion.
Obwohl Sie, wie andere haben darauf hingewiesen, früher eine __autoload() würde wahrscheinlich gut funktionieren für Sie.
InformationsquelleAutor der Antwort talentedmrjones
Können Sie
call_user_func()
:Das erste argument ist ein
callback
Typ mit der Klassenname und Methodenname in diesem Fall.InformationsquelleAutor der Antwort Greg
Warum nicht __autoload () - Funktion?
http://www.php.net/autoload
dann müssen Sie nur instanziieren Objekt, wenn nötig.
InformationsquelleAutor der Antwort kodisha
Sieht es aus wie Sie kämpfen PHP die aktuelle Implementierung statischer Bindung, die ist, warum Sie springen durch Reifen mit getCallingClass. Ich kann Euch aus Erfahrung sagen, sollten Sie wahrscheinlich aufgeben und versuchen, die Instanziierung in einer übergeordneten Klasse über eine statische Methode. Es wird führen, dass Sie mehr Probleme in der end. PHP 5.3 wird die Umsetzung "späte statische Bindung" und sollte Ihr problem lösen, aber natürlich nicht jetzt helfen.
Sind Sie wahrscheinlich besser dran mit dem autoload-Funktionalität erwähnt kodisha kombiniert mit einer soliden Singleton-Implementierung. Ich bin mir nicht sicher, ob Ihr Ziel ist syntaktischer Zucker oder nicht, aber es denke, Sie werden besser auf lange Sicht zu meiden versuchen, zu sparen Sie ein paar Zeichen.
InformationsquelleAutor der Antwort Barrett Conrad
Aus der Spitze von meinem Kopf, muss das testen, Validierung etc:
InformationsquelleAutor der Antwort J.C. Inacio
Späte statische Bindung wird für Sie arbeiten, denke ich. In dem Konstrukt von jeder Klasse:
Dann...
Hier ist ein autoloader, den ich schuf. Sehen, ob dies löst dein dilemma.
Dann alles, was Sie tun müssen, ist
aber Sie haben eine php-Datei im Pfad mit dem Namen
ClassName.php
wo ClassName ist der gleiche wie der name der Klasse, die Sie instanziieren möchten.
InformationsquelleAutor der Antwort Corey Ray