Wywołanie statycznej metody w PHP

Próbuję wywołać statyczną metodę z innej metody w tej samej klasie. Nie działa

$this::metoda();

ani

$this->metoda();

Na czym może polegać problem? Próbowałem na różne sposoby i nic. Czego może brakować?

  • Wewnątrz klasy możesz korzystać zarówno z odwołania poprzez słowo kluczowe self jak i poprzez nazwę kwalifikowaną, z użyciem nazwy klasy. Np:

    <?php
        class A {
            public static function Statyczna() {
                echo 'Statyczna';
            }
            public function Zwykla() {
               self::Statyczna();
               A::Statyczna(); // równoważny zapis
            }
        }
    ?>
    

    Na zewnątrz wywołanie statycznej metody możliwe jest zarówno przy użyciu instancji obiektu, jak i samej klasy:

    <?php
       $a = new A;
       $a->Statyczna();
       A::Statyczna(); // to samo co wyżej
    ?>
    

    W przypadku dziedziczenia, chcąc wywołać metodę statyczną z klasy bazowej, można użyć zamiast słowa self, słowo parent ( w sytuacji kiedy zasłoniliśmy metodę statyczną w klasie pochodnej - zamiana taka nie jest konieczna, ponieważ metody statyczne są dziedziczone ).

    W PHP wersji 5.3 wprowadzona została nowa funkcjonalność - późne wiązanie metod statycznych. Wprowadzono nowe zastosowanie słowa kluczowego static. Późne wiązanie umożliwia tworzenie wirtualnych metod statycznych.

    class A {
        public static function Statyczna() {
            echo 'Statyczna A';
        }     
        public static function PozneWiazanie() {
            static::Statyczna(); // odwołanie poprzez static, a nie self
        }
        public static function WczesneWiazanie() {
            self::Statyczna(); // zawsze wywoła metodę z tej klasy
        }
    }
    
    class B extends A {
        public static function Statyczna() {
            echo 'Statyczna B';
        }
    }
    
    B::WczesneWiazanie(); // metoda "Statyczna()" z klasy A
    B::PozneWiazanie(); // metoda "Statyczna()" z klasy B
    

    Obydwie metody: WczesneWiazanie() i PozneWiazanie() zostały odziedziczone w klasie B z klasy A. Pierwsze wywołanie B::WczesneWiazanie() powoduje wywołanie metody z klasy A, pomimo tego, że została ona przesłonięta w klasie pochodnej. Wynika to z wczesnego wiązania, które jest domyślne w przypadku użycia słowa self. Natomiast drugie wywołanie działa już poprawnie w tym sensie, że odwołanie, które następuje wewnątrz odziedziczonej metody z klasy A, jest poprawnie przekierowywane do statycznej metody klasy B (jej nowej definicji).

  • Myślę, że

    self::metoda()
    

    powinno załatwić sprawę.

    $this daje dostęp do obiektu, a self do składowych statycznych klasy.

  • Jeszcze od siebie dorzucę:

    Metoda statyczna jest związana z klasą, a nie instancją.

    Wywołanie: $instancja->metodaStatyczna()

    jest więc trochę bez sensu.

Zaloguj się, aby dodać swoją odpowiedź