2012-04-10 17 views
5
<?php 
$ar = (object) array('a'=>function(){ 
    echo 'TEST'; 
}); 
$ar->a(); 
?> 

Ich erhalte diese Störung Call to undefined MethodeFunktion von einem Objekt aufrufen?

+1

wahrscheinlich verwirren Sie dies zwischen Javascript Syntax-Stil und PHP-Syntax-Stil .... Denken Sie noch einmal, was Sie suchen –

+0

ja, es aint gona Arbeit wie in Javascript in der Tat. – mpm

+0

@OMTheEternity Closures existieren in PHP (http://www.php.net/manual/en/functions.anonymous.php). Das Konvertieren von Arrays in Objekten ist möglich. Die Frage ist gültig und wirft einen interessanten Punkt auf, um Dinge IMO zu machen. –

Antwort

2

Anonym oder nicht, haben Sie eine Callback-Funktion, so müssen Sie es als solche behandeln. Zum Beispiel:

3

Update:

Wenn Sie mit PHP 5.3 oder höher, einen Blick auf andere Antworten nehmen Sie bitte :)


Ich glaube nicht, dass das richtige Syntax ist, würde es Ihnen geben:

Parse error: syntax error, unexpected T_FUNCTION in.... 

Sie müssen eine Klasse zu erstellen, fügen Methode, um es verwenden new Schlüsselwort es zu instanziiert und dann werden Sie in der Lage zu tun:

$ar->a(); 

class myclass 
{ 
    public function a() 
    { 
     echo 'TEST'; 
    } 
} 

$ar = new myclass; 
$ar->a(); // TEST 

See Classes and Objects für weitere Informationen.

+0

Aber ich versuche Ahmed Saber versucht, eine Closure-Funktion zu verwenden, anstatt die Klasse so zu deklarieren, wie Sie es tun. – ANisus

+0

@ANisus: Es sieht so aus, aber selbst das würde 'Fatal error: Aufruf an undefinierte Methode stdClass :: a()' zur Folge haben. @Mukesh hat unten eine Antwort gegeben, mal sehen, ob das ist, was er sucht :) – Sarfraz

0

Es gibt keine Funktion a(), aber die Eigenschaft a, so sollten Sie es von $ar->a anrufen.
Ich denke sowieso nicht, dass es so funktionieren wird, wie Sie es erwarten.

EDIT: Wie von Álvaro G. Vicario vorgeschlagen sollten Sie call_user_func verwenden, echo nicht die Funktion aufrufen und es wird korrekt funktionieren.

0

Oder nur für den Spaß von ihm, können Sie etwas tun -

<?php 
$ar = new stdClass; 
$ar->a = function($to_echo){ echo $to_echo; }; 
$temp = $ar->a; 

//[Edit] - $ar->a("hello"); // doesn't work! php tries to match an instance method called  "func" that is not defined in the original class' signature 
$temp("Hey there"); 
call_user_func($ar->a("You still there?")); 
?> 
+0

Hast du diesen Code tatsächlich ausprobiert? –

+0

Nein, ich habe nicht. Ist es falsch? –

+0

'Fataler Fehler: Aufruf zu undefinierter Methode stdClass :: a()' in meinem 5.3 Feld. –

2

Aus irgendeinem Grund scheint es nicht möglich, die Schließung so zu führen, wie Sie es tun. Wenn Sie Ihren Code ändern und eine andere Variable an die Funktion eingestellt ist, kann es aufgerufen werden:

$ar = (object) array('a'=>function(){ 
    echo 'TEST'; 
}); 
$a = $ar->a; 
$a(); 

Dies ist keine Lösung. Aber von dem, was ich sehen kann, scheint dies ein Bug oder eine Einschränkung in PHP 5.3 zu sein.

Ich benutze 5.3.5 bei dem Versuch dies.

+0

Ist es nicht $ a = $ ar-> a; 'statt $ a = $ ar-> a();'? (Sie holen die Eigenschaft, die eine Schließung ist, und rufen Sie dann mit $ a()) –

+0

Oh, natürlich ist es. Zu schnell eingegeben. Es wurde jetzt behoben. Danke, dass du es aufgezeigt hast. – ANisus

Verwandte Themen