call_user_func + Singleton + Linux = FAIL

Hey,

Ich hab ein Problem mit meinem Framework, es will einfach nicht auf meinem Linux-vServer laufen.
Das Problem ist folgender Aufbau:

Code:
if(preg_match("/^[a-z]+[a-z0-9]*$/i", $pluginname)){
                        $debugger -> log("Loading Plugin $pluginname");
                        require_once($folder . '/' . $item);
                        $classname = "plugin_" . $pluginname;
                        $obj = call_user_func($classname."::getInstance");
                        $this -> plugins[$pluginname] = $obj;
Die Dateien werden ordnungsgemäß eingebunden, allerdings mit der Warnung:
Warning: call_user_func(plugin_session::getInstance) [function.call-user-func]: First argument is expected to be a valid callback in /var/www/[...]/plugins/session.php on line 45

Weiterhin hängt der Fehler in der call_user_func, da
Code:
plugin_session::getInstance();//Funktioniert
call_user_func("plugin_session::getInstance");//Funktioniert NICHT!
Unter meinem lokalen xampp hab ich allerdings keine Probleme.
Auf beiden OS benutz ich PHP5, wohl leicht unterschiedliche Versionen:

vServer:
PHP 5.2.6-1+lenny9 with Suhosin-Patch 0.9.6.2 (cli) (built: Aug 4 2010 06:06:53)
localhost:
PHP 5.3.1 (cli) (built: Nov 20 2009 17:26:32)

Um jetzt nicht in allen plugin-dateien zum Schluss ein
$instance = plugin_<name>::getInstance(); schreiben zu müssen muss ich iwie diesen Fehler beheben..
Jemand eine Idee?


MfG


EDIT
Wie jedes mal - Nach 2 Std verzweifeltem googeln stellt man die Frage und nach 5 min findet man es dann selbst raus:
Code:
call_user_func(array("plugin_session","getInstance"));
-.-
 
Zuletzt bearbeitet:
Weiterhin hängt der Fehler in der call_user_func, da
Code:
plugin_session::getInstance();//Funktioniert
call_user_func("plugin_session::getInstance");//Funktioniert NICHT!

Ahm, getInstance() wird dir ein Objekt liefern, du musst aber eine Callback-Methode angeben.

Schau mal hier: PHP: call_user_func - Manual

Das sollte also eher so aussehe:
Code:
call_user_func("plugin_session::getInstance[B]->myCallbackFunction[/B]")

EDIT
Wie jedes mal - Nach 2 Std verzweifeltem googeln stellt man die Frage und nach 5 min findet man es dann selbst raus:
Code:
call_user_func(array("plugin_session","getInstance"));
-.-

Ouh ... xD
 
Zuletzt bearbeitet:
Das Problem hat weder was mit Singleton noch was mit Linux zu tun sondern lediglich mit der falschen Verwendung einer Funktion.

Dass in einem System Warnungen angezeigt werden und im anderen nicht, liegt an der unterschiedlichen PHP-Konfiguration, speziell an error_reporting

Ein korrekter Callback zu einer Methode einer Klasse besteht normalerweise aus einem Array, welches die Instanz der Klasse und den Namen der aufzurufenden Methode enthält!

Für deinen Fall, also dem Aufrufen einer statischen Methode, geht einerseits die Lösung, wie du sie im Edit hast oder es könnte auch folgendes funktionieren:

PHP:
$foo = $classname::getInstance();
oder evtl über die Reflection-Klasse.
Da ich gerade mit Handy unterwegs bin, kann ich das gerade nicht testen...
 
Das Problem hat weder was mit Singleton noch was mit Linux zu tun sondern lediglich mit der falschen Verwendung einer Funktion.
Dem würd ich glatt zustimmen, wenn es denn auch unter meinem Xampp nicht laufen würde. Der macht das nämlich ohne mucks


Example #4 Using a class method with call_user_func()
call_user_func(array($classname, 'say_hello'));
call_user_func($classname .'::say_hello'); // As of 5.2.3



geht wohl laut der Manual auch ;) Also kann ich die Funktion auch gar nicht so fatal falsch angewendet haben



$foo = $classname::getInstance();

das geht leider nicht, hab ich versucht. Aber ich habs ja jetzt hinbekommen

Danke nochmal^^
 
das geht leider nicht, hab ich versucht. Aber ich habs ja jetzt hinbekommen

Nur der vollständigkeitshalber. Ich wüsste nicht, warum dieses Sprachkonstrukt nicht verwendet werden könnte.


Code:
[B]sheeep@willow:~$[/B] php --version
PHP 5.3.5-1ubuntu7.2 [...]
[B]sheeep@willow:~$[/B] php cuf.php 
b
a
PHP:
<?php

class Habo
{
    public function a()
    {
        echo "a\n";
    }
    
    public static function b()
    {
        echo "b\n";
    }
}

$foo = 'Habo';

$foo::b();

$bar = new $foo();
$bar->a();

?>
 
Zurück
Oben