kostenloser Webspace werbefrei: lima-city


Parameter 2 to test() expected to be a reference, value given

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    fchriis

    fchriis hat kostenlosen Webspace.

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. 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
  4. Autor dieses Themas

    fchriis

    fchriis hat kostenlosen Webspace.

    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!
  5. 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
  6. 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
  7. Autor dieses Themas

    fchriis

    fchriis hat kostenlosen Webspace.

    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
  8. 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 ;)
  9. Autor dieses Themas

    fchriis

    fchriis hat kostenlosen Webspace.

    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
  10. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!