Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme.

call_user_func + Singleton + Linux = FAIL

Diskussion: call_user_func + Singleton + Linux = FAIL im Forum Code Kitchen, in der Kategorie Software Home; Anzeige Hey, Ich hab ein Problem mit meinem Framework, es will einfach nicht auf meinem Linux-vServer laufen. Das Problem ist ...

Antwort
Alt 20.05.11, 18:24   #1 (permalink)
 
Benutzerbild von ChiefWiggum
 
Registriert seit: 09.10.07
ChiefWiggum Leistung: 8086
ChiefWiggum eine Nachricht über ICQ schicken
Likes: 11
erledigt call_user_func + Singleton + Linux = FAIL

Anzeige

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"));
-.-
__________________
Be the source always with you.

Geändert von ChiefWiggum (20.05.11 um 18:30 Uhr) Grund: .
ChiefWiggum ist offline   Mit Zitat antworten
Alt 20.05.11, 21:27   #2 (permalink)
 
Benutzerbild von blue182
 
Registriert seit: 21.08.10
blue182 Leistung: Facit NTK
Likes: 10
Standard

Zitat:
Zitat von ChiefWiggum Beitrag anzeigen
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->myCallbackFunction")
Zitat:
Zitat von ChiefWiggum Beitrag anzeigen
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

Geändert von blue182 (20.05.11 um 21:29 Uhr)
blue182 ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 20.05.11, 22:28   #3 (permalink)
Member of Honour
 
Benutzerbild von beavisbee
 
Registriert seit: 22.02.07
beavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium III
beavisbee eine Nachricht über ICQ schicken
Likes: 77
Standard

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-Code:
$foo $classname::getInstance(); 
oder evtl über die Reflection-Klasse.
Da ich gerade mit Handy unterwegs bin, kann ich das gerade nicht testen...
beavisbee ist offline   Mit Zitat antworten
Alt 21.05.11, 11:25   #4 (permalink)
Themenstarter
 
Benutzerbild von ChiefWiggum
 
Registriert seit: 09.10.07
ChiefWiggum Leistung: 8086
ChiefWiggum eine Nachricht über ICQ schicken
Likes: 11
Standard

Zitat:
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



Zitat:
$foo = $classname::getInstance();

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

Danke nochmal^^
__________________
Be the source always with you.
ChiefWiggum ist offline   Mit Zitat antworten
Alt 23.05.11, 08:44   #5 (permalink)
 
Benutzerbild von she3p
 
Registriert seit: 07.05.07
she3p Leistung: 8086
Likes: 19
Standard

Zitat:
Zitat von ChiefWiggum Beitrag anzeigen
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:
sheeep@willow:~$ php --version
PHP 5.3.5-1ubuntu7.2 [...]
sheeep@willow:~$ php cuf.php 
b
a
PHP-Code:
<?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();

?>
__________________
she3p ist offline   Mit Zitat antworten
Alt 23.05.11, 10:35   #6 (permalink)
Themenstarter
 
Benutzerbild von ChiefWiggum
 
Registriert seit: 09.10.07
ChiefWiggum Leistung: 8086
ChiefWiggum eine Nachricht über ICQ schicken
Likes: 11
Standard

Okay ich hatte was a la
$a::$b() versucht^^.
__________________
Be the source always with you.
ChiefWiggum ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » call_user_func + Singleton + Linux = FAIL
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61