2010-11-24 5 views
6

ich PHP bin mit 5.2In PHP ist es ein Problem, eine statische Klasse-Funktion der rufen -> Dereferenzierer

Ich habe den folgenden Code:

class MyClass { 
    public function __construct() {} 

    public static function stuff() { 
     echo 'This is static! <br />'; 
    } 

} 

$myClass = new MyClass(); 

MyClass::stuff(); // Reference by class. 

$myClass->stuff(); // Reference by instance of class. 

Der Ausgang arbeitet in beiden hier Fällen der Ausgang ist:

Dies ist statisch!

Dies ist statisch!

Gibt es ein Problem, die zweite Möglichkeit der Referenzierung im Vergleich zu dem ersten mit?

Da ich nicht eine nicht-statische Funktion mit der gleichen Signatur wie die statischen oben zu haben, dass ich erlaubt wird kein Problem sein. Ich möchte, dass die Funktion statisch ist, da es auch eine Geschwindigkeitssteigerung gibt, wenn statische Funktionen verwendet werden.

Fehle ich etwas oder ist das nur hier Frage in Bezug auf die Semantik, wie die -> dereferenzieren Syntax nicht an, bedeutet dies eine statische Funktion ist?

+0

Gute Frage. :) –

+0

Es ist funktional gleichwertig. Der statische Aufruf wird nur mit einem leeren lokalen Bereich ausgeführt, während '->' Aufrufe ein $ diese Instanz haben. Das Schlüsselwort "static" ist hauptsächlich ein NOP für Ihren Fall, relevant nur für self :: references. – mario

+0

@mario, das ist falsch. Wie auch immer, es ist eine statische Methode und '$ this' ist nicht verfügbar. –

Antwort

6

Die docs ausdrücklich sagen, es ist in Ordnung:

Eine Eigenschaft als statisch deklariert kann nicht mit einem instantiierten Klasse Objekt (obwohl eine statische Methode kann) zugegriffen werden.

Es ist jedoch klarer zu verwenden ::. Ich stelle auch die Idee in Frage, dass die statische Methode wesentlich schneller ist, insbesondere wenn keine Instanzfelder verwendet werden. Sie sollten Profiling durchführen, bevor Sie beginnen, die Semantik Ihrer Anwendung für die Leistung zu ändern.