2010-04-14 6 views
10

Wenn ich call_user_func auf einer nicht-statische Methode in PHP 5.2 verwenden erhalte ich eine strenge Warnung:Ist es in PHP 5.3 ok, nicht statische Methoden mit call_user_func aufzurufen?

Strict Standards: Non-static method User::register() cannot be called statically 

Aber auf PHP 5.3.1 ich diese Warnung nicht erhalten. Ist das ein Bug in PHP 5.3.1 oder wurde die Warnung entfernt?

+0

Sie erhalten die gleiche Warnung auf PHP5.3. Sieht aus wie deine php5.3 und php5.2 Konfiguration anders ist. Schau dir 'error_reporting' an. – vooD

Antwort

23

Es ist vollkommen in Ordnung - aber beachten Sie, dass Sie ein Objekt zu übergeben, die eine Instanz der Klasse ist, an dem das nicht-statische Methode Objekt, um anzuzeigen, soll heißen:

class MyClass { 
    public function hello() { 
     echo "Hello, World!"; 
    } 
} 

$a = new MyClass(); 
call_user_func(array($a, 'hello')); 


Sie So etwas sollte nicht verwendet werden:

call_user_func('MyClass::hello'); 

, die Ihnen die folgende Warnung geben:

Strict standards: `call_user_func()` expects parameter 1 to be a valid callback, 
non-static method `MyClass::hello()` should not be called statically 

(Dies würde perfekt funktionieren, wenn die Methode als statisch deklariert wurde ... aber es ist nicht, hier)


Für weitere Informationen, können Sie einen Blick auf die callback Abschnitt des Handbuchs nehmen, mit der erklärt, unter anderem (Zitat):

Verfahren zur Herstellung eines instanziierten Objekts als Array übergibt ein Objekt mit Index 0 und die Methodennamen enthalten an dem Index 1.


Wenn Sie einen strengen Fehler mit PHP 5.2 bekommen und nicht mit PHP 5.3, es ist wahrscheinlich eine Frage der Konfiguration - ich bin über die error_reporting Richtlinie zu denken.

Beachten Sie, dass E_ALL nicht enthalten E_STRICT(quoting):

E_ALL: Alle Fehler und Warnungen, wie unterstützt, mit Ausnahme von Stufe E_STRIC T.

+1

E_STRICT soll in E_ALL in PHP 5.3 enthalten sein, denke ich. Übrigens, ich habe das Objekt instanziiert und dann funktioniert es gut. – sandelius

+0

OK über die Instanziierung des Objekts :-) ;;; Ich glaube nicht, dass E_STRICT in E_ALL enthalten ist, auch in PHP 5.3 - ich nehme an, es wäre so in der Anleitung gesagt ;-) –

+0

'E_ALL' enthält' E_STRICT' in 5.5 sicher. –

Verwandte Themen