2010-12-01 3 views
2

Ich habe ein PHP-Skript, das in PHP 5 funktioniert, aber nicht in PHP 4. Ich habe einen kleinen Testfall für Sie demonstriert (Disclaimer: Ich weiß, dass der untenstehende Code sein könnte geschrieben viel besser, aber es ist nicht ein tatsächlich verwendetes Stück, sondern derjenige zu zeigen, was ich spreche):Code funktioniert nicht in PHP 4

class Messenger { 
    var $messages = ''; 

    function add($message) { 
     $this->messages .= "$message\n"; 
    } 
} 

function add($m) { 
    if (! isset($GLOBALS['instance'])) $GLOBALS['instance'] = new Messenger(); 
    call_user_func_array(array($GLOBALS['instance'], 'add'), array($m)); 
} 

add("One"); 
add("Two"); 
add("Three"); 

var_dump($GLOBALS['instance']->messages); 

unter PHP 5 die messages Eigenschaft all 3 Nachrichten enthält, unter PHP 4 er leer ist. Warum?

+0

re Ihren Kommentar zu meinem Beitrag, sie ist absolut richtig. Wie ich auf der Unterseite erwähnt habe, bin ich ein bisschen Kaffee entzogen. Auch war unter dem Eindruck, meine Testbox hier bei der Arbeit war ein 4.x, aber ich denke, es wurde seither aufgerüstet. (Glück für mich alle Entwicklung residiert sowieso im Haus). Es ist auch nicht so, dass Sie in PHP nicht dasselbe machen können, nur können Sie die Methoden nicht als statisch bezeichnen. Gute PHP4 Demo: http://abing.gotdns.com/posts/2006/php4-tricks-the-singleton-pattern-part-i/ –

Antwort

3

In PHP 4, $this scheint nicht funktionieren auf die gleiche Weise wie PHP 5 tut.

Die $ this Pseudovariable ist normalerweise nicht definiert, wenn die Methode, in der sie gehostet wird, statisch aufgerufen wird. Dies ist jedoch keine strikte Regel: $ Dies ist definiert, wenn eine Methode statisch aus einem anderen Objekt aufgerufen wird. In diesem Fall ist der Wert von $ das des aufrufenden Objekts. Dies wird im folgende Beispiel veranschaulicht:

Beispiel: http://www.php.net/manual/en/keyword.class.php

+0

Touche auf den "$ this" Gebrauch zu fangen. –

+0

Ich glaube nicht, dass dieser Code es statisch aufruft. call_user_func_array wird verwendet, um die Methode für eine Instanz aufzurufen, nicht für die Klasse. –

+0

@Jani Hartikainen - deshalb funktioniert es nicht, Sie können dem oben aufgeführten Beispiel folgen (vorausgesetzt, Sie haben PHP 4) – ajreal