2015-04-29 6 views
11

Ich denke, diese Frage ist mehr auf die Sprache-Geeks ausgerichtet. Ich habe die folgende Klasse:Aufruf einer öffentlichen, statischen Funktion in einer abstrakten Klasse

<?php 
abstract class ScopeFactory 
{ 
    public static function doStuff() 
    { 

    } 
} 

Nun, ich bin in der Lage, diese Funktion aufzurufen, etwa so:

ScopeFactory::doStuff()

Und das funktioniert glücklich. Ich habe immer unter dem Eindruck codiert, dass abstract Klassen nicht direkt verwendet werden können - und sie müssen von einer konkreten Klasse implementiert werden, um aufrufbar zu sein.

Mein Eindruck von static ist, dass es keine Instanz aufrufbar sein muss.

Könnte mir jemand erklären, warum das legal ist, und wenn es sein sollte? Ich bin neugierig auf die feineren Details.

+1

Ja, eine statische Methode wird nicht an derselben Stelle wie die Klasseninstanz gespeichert (Instanz! = Deklaration). Dies wird Ihnen Hinweise geben: http://stackoverflow.com/questions/17407203/can-we-use-static-method-in-anabstract-class –

Antwort

6

Statische Methoden in OOP ändern den internen Status nicht, daher können Sie statische Methoden aus einer abstrakten Klasse aufrufen.

+0

Ich bin interessiert zu wissen (auf einer niedrigen Ebene) wie Dies ist in der PHP-Laufzeit implementiert - jede Einsicht? Und mit * internem Zustand * meinst du * interner Zustand der abstrakten Klasse *? – infomaniac

+0

Mit internem Zustand meine ich nur internen Zustand. Statische Methoden sollten intern nichts speichern und somit den internen Zustand ändern. Z.B. Bekommen Sie einfach eine Eingabe, machen Sie Dinge und geben Sie das Ergebnis aus, das mit der gleichen Eingabe übereinstimmt. Sie können nur statische Methoden wie allgemeine PHP-Funktionen bedrohen. –

4

Ich wäre überrascht, wenn dies nicht erlaubt wäre. Die abstrakte Klasse geht davon aus, dass Sie sie nicht instanziieren können. Da statische Methoden keine Klasseninstanz benötigen, können Sie sie gerne verwenden.

Blick tiefer, könnten Sie eine abstrakte statische Methode und rufen Sie es von Ihrem nicht-abstrakte Methode erstellen:

abstract class ScopeFactory 
{ 
    public static function doStuff() 
    { 
     static::otherStuff(); 
    } 

    abstract public static function otherStuff(); 
} 

PHP geben Ihnen einen fatalen Fehler sagen Sie nicht eine abstrakte Methode aufrufen können. Aber es wird Ihnen auch eine E_STRICT-Warnung geben, die besagt, dass Sie keine abstrakten statischen Methoden erstellen sollten.