2012-05-01 2 views
8

Mögliche Duplizieren:
PHP: Static and non Static functions and ObjectsWarum kann ich in PHP statisch auf nicht statische Methoden zugreifen?

Im folgenden Code, nicht-statische() ist nicht eine statische Methode. Selbst dann kann ich darauf zugreifen, ohne ein Objekt zu erstellen (auf statische Art). Kann mir bitte jemand helfen, da dies in anderen Sprachen wie Java nicht möglich ist?

+4

weil OO-Konzepte im Nachhinein mit PHP verschraubt wurden? Ernsthaft, PHP, ist kein Modell für OOP-Studie. – DGM

+0

Sie können es statisch aufrufen, solange es keine Instanzreferenzen ('$ this') enthält. Ich bin mir nicht sicher, ob Sie Warnungen unter "E_STRICT" erhalten (ich hoffe, dass Sie das tun). –

+0

Ich stimme nicht zu, das ist ein Duplikat, da diese Frage mindestens –

Antwort

0

Nicht sicher, wahrscheinlich einige PHP-Magie (es ist manchmal ein bisschen so), aber Sie sollten es nicht tun.

mehr hier lesen http://php.net/manual/en/language.oop5.static.php

Sie zeigen auch ein ähnliches Beispiel, aber beachten Sie:

Aufruf nicht-statische Methoden erzeugt statisch eine E_STRICT Ebene Warnung Bedeutung dieses magische Fähigkeit in zukünftigen Versionen verschwinden. Also tu es nicht :)

+1

bessere Erklärungen enthält. Im Allgemeinen versucht PHP, wenn möglich, nicht zu crashen und zu brennen, wenn es unnötig ist. In seinem Beispiel wird nichts Nicht-Statisches gemacht, und deshalb ist die Methode effektiv statisch. Der andere Weg, um darüber nachzudenken, ist static ist eine Möglichkeit, PHP zu überprüfen, um sicherzustellen, dass Sie keinen Aufruf an $ this, da die Methode statisch verwendet werden soll - was ist, was alle anderen Sprachen sowieso tun. Es ist nur ein Konstrukt.PHP kompiliert und führt es sofort aus, da es sich um eine Skriptsprache handelt, so dass es flexibler ist und es ermöglicht, diesen normalerweise fatalen Fehler in eine Warnung umzuwandeln. –

2

Es scheint, als ob die Entwickler von PHP keinen Wert darin sehen, den statischen Zugriff von nicht statischen Methoden zu verbieten. Dies ist nur eines dieser idiosynkratischen Features von PHP, die eigentlich keinen Zweck erfüllen. Es ist sicherlich eine schlechte Programmierpraxis, eine nicht statische Methode statisch aufzurufen, aber in PHP ist es möglich. Vielleicht werden sie dies in einer zukünftigen Version von PHP nicht zulassen, aber im Moment ist es nur ein Teil der Sprache.

Edit:

Zum Glück das Gegenteil ist nicht erlaubt - man kann nicht eine statische Methode aus einem Objektkontext nennen. Wie Jack unten dargelegt hat, können Sie eine statische Methode aus einem Objektkontext aufrufen - kaum eine Best Practice im OOP-Paradigma, aber es ist erlaubt.

+1

Das Gegenteil * ist * eigentlich erlaubt; nicht sicher, ob das gut oder schlecht ist ;-) –

+0

Danke, dass du mich darauf aufmerksam gemacht hast, Jack! Ich habe meinen Kommentar aktualisiert. – Andrew

6

Es ist erlaubt, aber es erzeugt eine E_STRICT Warnung:

Error #: 2048, Error: Non-static method MyClass::nonStatic() should not be called statically, assuming $this from incompatible context 

In den früheren OO-Implementierungen von PHP dies geräuschlos erlaubt wurde, aber besser Praktiken seit verabschiedet.

Die entgegengesetzten Arbeiten ohne Probleme aber:

class Test 
{ 
    function foo() 
    { 
     echo $this->bar(); 
    } 

    static function bar() 
    { 
     return "Hello world\n"; 
    } 
} 

$x = new Test; 
$x->foo(); 

Dieser druckt Hello world.

Verwandte Themen