2015-04-29 30 views
11

Domyślam się, że to pytanie jest nastawione bardziej na maniaków języka. Mam następujące klasy:Wywołanie publicznej, statycznej funkcji w abstrakcyjnej klasie

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

    } 
} 

Teraz jestem w stanie wywołać tę funkcję tak:

ScopeFactory::doStuff()

I to działa szczęśliwie. Zawsze kodowałem pod wrażeniem, że klasy abstract nie mogą być używane bezpośrednio - i muszą być zaimplementowane przez konkretną klasę, aby można było wywoływać.

Moje wrażenia z numeru static polegają na tym, że nie wymaga on wywołania instancji .

Czy ktoś mógłby mi wyjaśnić, dlaczego jest to zgodne z prawem, a jeśli tak, to powinno być? Jestem ciekawy szczegółów.

+1

Tak statyczna metoda nie jest przechowywana w tym samym miejscu co instancja klasy (instancja! = Deklaracja). To da ci wskazówki: http://stackoverflow.com/questions/17407203/can-we-use-static-method-in-an-abstract-class –

Odpowiedz

6

Metody statyczne w OOP nie zmieniają stanu wewnętrznego, dlatego można wywoływać metody statyczne z klasy abstrakcyjnej.

+0

Chciałbym wiedzieć (na niskim poziomie), jak jest to zaimplementowane w środowisku wykonawczym PHP - jakiekolwiek wgląd? A przez * stan wewnętrzny * masz na myśli * stan wewnętrzny abstrakcyjnej klasy *? – infomaniac

+0

Według stanu wewnętrznego mam na myśli tylko stan wewnętrzny. Metody statyczne nie powinny niczego zapisywać wewnętrznie, zmieniając w ten sposób stan wewnętrzny. Na przykład. po prostu uzyskaj dane wejściowe, wykonaj czynności i wyprowadź wynik, który będzie taki sam dla tego samego wejścia. Możesz po prostu zagrozić statycznym metodom, takim jak ogólne funkcje PHP. –

4

Byłbym zaskoczony, gdyby to nie było dozwolone. Klasa abstrakcyjna zakłada, że ​​nie można jej utworzyć. Ponieważ metody statyczne nie wymagają instancji klasy, możesz z nich korzystać.

Patrząc głębiej, można tworzyć abstrakcyjne metody statycznej i wezwać go z non-abstrakcyjnej metody:

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

    abstract public static function otherStuff(); 
} 

PHP daje błąd krytyczny mówiąc nie można nazwać abstrakcyjną metodę. Ale również da ci ostrzeżenie E_STRICT mówiąc, że nie powinieneś tworzyć abstrakcyjnych metod statycznych.