Parameter 2 to test() expected to be a reference, value given
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
array
aufrufen
code
datenbank
entwerfen
file
funktion
geschichte
information
lager
liegen
methode
nachdenken
ordner
parameter
problem
referenz
string
test
versuchen
-
Hallo,
ich hab ein Problem was meinen Code angeht :D
Ich bekomm folgenden Fehler:
Warning: Parameter 2 to test() expected to be a reference, value given
Der Code:
. $foo = "foo"; Plugin::fireEvent('test', $foo); public static function fireEvent ($eventName) { $parameters = func_get_args(); if (isset(self::$eventHandler[$eventName])) { foreach (self::$eventHandler[$eventName] as $eventHandler) { call_user_func_array($eventHandler, $parameters); } } } function test ($eventName, &$testVar) { }
Würd mich freund, wenn ihr mir helfen könntet ;)
Vielen Dank,
Chris -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hallo Chris,
ich würde mich gerne um dein Problem kümmern, doch ich habe zu wenig Informationen.
Kannst du die komplette Klasse "Plugin" einmal posten?
Dann kann ich dir sicher weiterhelfen :)
Gruß,
dex -
klar, hier alle dateien ;)
plugin.class.php<?php /** * Mit dieser Klasse erweiterst du dein Projekt um eine Pluginunterstützung. ** Inaktive Plugins liegen in PLUGIN_DIR/inactive/ ** Aktive Plugins liegen in PLUGIN_DIR/active/ * Die Plugins liegen in PLUGIN_DIR * * Jedes Plugin ist ein Ordner mit einer plugin.txt, in dem * Meta-Informationen im JSON-Format abgelegt sind. * * Ein Plugin ist aktiv, wenn sich in seinem Ordner eine leere Textdatei mit * dem Namen "active" befindet. * * Desweiteren braucht jedes * Plugin eine plugin.php, die bei jedem Seitenaufruf aufgerufen wird. Dort * kann man mittels Plugin::addEventHandler() seinen Code einbringen. * * @author Chris! * @license public domain */ class Plugin { public static $DIR; public static $loadedPlugins = array(); public static $eventHandler = array(); public $title = ''; public $author = ''; public $authorURL = ''; public $description = ''; public $version = ''; /** * Prüft ob ein Plugin installiert ist. * @param string $pluginName * @return boolean */ public static function isInstalled ($pluginName) { return file_exists(self::$DIR.$pluginName.'/plugin.txt'); } /** * Prüft ob ein Plugin aktiv ist. * @param string $pluginName * @return boolean */ public static function isActive ($pluginName) { return file_exists(self::$DIR.$pluginName.'/active'); } /** * Prüfz ob ein Plugin geladen ist. * @param string $pluginName * @return booelan */ public static function isLoaded ($pluginName) { return in_array($pluginName, self::$loadedPlugins); } /** * Prüft ob der Pluginname valide ist. * @param string $pluginName * @return boolean */ public static function isValidPluginName ($pluginName) { return preg_match('/([a-zA-Z-]+)([a-zA-Z0-9-]*)/', $pluginName); } public function __construct ($pluginName) { $this->pluginName = $pluginName; // prüfen ob Plugin vorhanden if (!Plugin::isInstalled($pluginName)) throw new Exception ('Plugin not found'); // Meta-Informationen laden $metaInfo = file_get_contents(self::$DIR.$pluginName.'/plugin.txt'); $metaInfo = json_decode($metaInfo, true); $this->title = (!empty($metaInfo['title']) ? $metaInfo['title'] : ''); $this->author = (!empty($metaInfo['author']) ? $metaInfo['author'] : ''); $this->authorURL = (!empty($metaInfo['authorURL']) ? $metaInfo['authorURL'] : ''); $this->description = (!empty($metaInfo['description']) ? $metaInfo['description'] : ''); $this->version = (!empty($metaInfo['version']) ? $metaInfo['version'] : ''); } /** * Aktivert das Plugin. */ public function enable () { if (!Plugin::isActive($this->pluginName)) file_put_contents(self::$DIR.$this->pluginName.'/active', ''); } /** * Deaktiviert das Plugin. */ public function disable () { if (Plugin::isActive($this->pluginName)) unlink(self::$DIR.$this->pluginName.'/active'); } /** * Startet alle Plugins. */ public static function loadPlugins () { $dir = opendir(self::$DIR); while ($file = readdir($dir)) { // prüfen ob Verzeichnis if (!is_dir(self::$DIR.$file)) continue; // prüfen ob Plugin if (!file_exists(self::$DIR.$file.'/plugin.txt')) continue; // prüfen ob Aktiv if (!file_exists(self::$DIR.$file.'/active')) continue; // prüfen ob plugin.php vorhanden und requiren if (file_exists(self::$DIR.$file.'/plugin.php')) { self::$loadedPlugins[] = $file; require_once(self::$DIR.$file.'/plugin.php'); } } closedir($dir); } /** * Fügt eine EventHandler hinzu. * @param string $eventName * @param mixed $eventHandler */ public static function addEventHandler ($eventName, $eventHandler) { if (!isset(self::$eventHandler[$eventName])) self::$eventHandler[$eventName] = array(); self::$eventHandler[$eventName][] = $eventHandler; } /** * Führt alle EventHandler zu einem Event aus. * Weitere Parameter können als Referenz übergeben werden. * @param string $eventName */ public static function fireEvent ($eventName) { $parameters = func_get_args(); if (isset(self::$eventHandler[$eventName])) { foreach (self::$eventHandler[$eventName] as $eventHandler) { call_user_func_array($eventHandler, $parameters); } } } } Plugin::$DIR = dirname(__FILE__).'/plugins/'; ?>
plugin.php<?php function test ($eventName, &$testVar) { $testVar = "bar"; } Plugin::addEventHandler('test', 'test'); ?>
index.php<?php error_reporting(E_ALL); require_once('Plugin.class.php'); Plugin::loadPlugins(); $p = new Plugin('testplugin'); var_dump($p); $foo = "foo"; Plugin::fireEvent('test', $foo); echo $foo; ?>
Vielen Dank! -
Ich habe keine eindeutige Lösung, aber ich denke ich weiß wo das Problem liegt.
Und zwar sagt uns die Fehlermeldung:
Es wird versucht eine Referenz einer Variable zu erzeugen, es wird aber ein String/Inhalt gesendet.
Das liegt daran, dass du mit call_user_func_array() keine Referenz, sondern den Inhalt sendest.
Versuche selbst eine Methode zu entwerfen, die die gleiche Funktion von call_user_func_array() hat, aber ein Array mit einer Referenz auf die gesendeten Parameter übergibt.
Klingt sehr verwirrend, ich weiß, ich hoffe trotz allem, dass du verstanden hast, was ich meine :)
Gruß,
dex -
call_user_func* kann keine Parameter als Referenz übergeben. Du musst also
$eventHandler($parameter)
schreiben oder in der Funktion das '&' entfernen.
Beitrag zuletzt geändert: 14.2.2010 19:00:13 von nikic -
qap2 schrieb:
Versuche selbst eine Methode zu entwerfen, die die gleiche Funktion von call_user_func_array() hat, aber ein Array mit einer Referenz auf die gesendeten Parameter übergibt.
das wär doch dann nur über evil-eval möglich, oder?
würd ich schon gern vermeiden :/
alternative wär das gesamte script umzuschreiben und auf eine Art Registry zu setzen oder derartiges.
danke für deine hilfe :)
Beitrag zuletzt geändert: 14.2.2010 19:06:51 von fchriis -
Ich sehe dein Skript als nicht ausgereift.
Die Sache mit Ordnern ist okay, aber die "isActive"-Geschichte gefällt mir nicht.
Über eine Datenbank ist sowas deutlich praktischer.
Außerdem würde ich dir empfehlen, deine "Plugins" als Klassenobjekte zu lagern.
Dann sind die Funktionen so zugänglich, wie du sie brauchst, und du kannst (wie nikic schrieb) deine Methoden in der von ihm geschrieben Form aufrufen.
Einfach mal darüber nachdenken, wie das System für dich besser ist, dann kommst du zum einzig richtigen Ergebnis ;) -
qap2 schrieb:
Ich sehe dein Skript als nicht ausgereift.
Die Sache mit Ordnern ist okay, aber die "isActive"-Geschichte gefällt mir nicht.
Über eine Datenbank ist sowas deutlich praktischer.
Das keine Datenbank im Backend läuft ist beabsichtigt.
qap2 schrieb:
Außerdem würde ich dir empfehlen, deine "Plugins" als Klassenobjekte zu lagern.
Dann sind die Funktionen so zugänglich, wie du sie brauchst, und du kannst (wie nikic schrieb) deine Methoden in der von ihm geschrieben Form aufrufen.
Einfach mal darüber nachdenken, wie das System für dich besser ist, dann kommst du zum einzig richtigen Ergebnis ;)
Die Plugins werden nachher in der Tat als Klassen gelagert, für einen ersten Test nach dem schreiben der Klasse tuts eine einfache Funktion aber auch.
Gibt es noch alternativen zu eval um das Referenzproblem zu lösen?
Mal abgesehen von einer anderen Strucktur zB durch eine Registry o.Ä.
Beitrag zuletzt geändert: 14.2.2010 19:22:01 von fchriis -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage