2012-06-29 9 views
11

Próbuję użyć funkcji PHP od wewnątrz funkcji publicznej statycznej jak tak (ja skróconymi rzeczy trochę):nie można uzyskać dostępu do siebie :: gdy nie ma zakres klasa jest aktywny

class MyClass { 

public static function first_function() { 

    function inside_this() {  
      $some_var = self::second_function(); // doesnt work inside this function 
    }    

    // other code here... 

} // End first_function 

protected static function second_function() { 

    // do stuff 

} // End second_function 

} // End class PayPalDimesale 

Wtedy otrzymasz komunikat "Nie można uzyskać dostępu sam :: gdy żaden zakres klasy nie jest aktywny".

Jeśli zadzwonię second_function poza funkcją inside_this, to działa dobrze:

class MyClass { 

public static function first_function() { 

    function inside_this() {  
      // some stuff here 
    }    

    $some_var = self::second_function(); // this works 

} // End first_function 

protected static function second_function() { 

    // do stuff 

} // End second_function 

} // End class PayPalDimesale 

Co muszę zrobić, aby móc korzystać second_function od wewnątrz funkcji inside_this?

+0

Czy próbowałeś zamknąć? 'function inside_this() use ($ self) {' – bfavaretto

+0

Po prostu wypróbowałem - nie działało :( – JROB

+0

Zdałem sobie sprawę zbyt późno, że 'self' nie jest zmienną ... – bfavaretto

Odpowiedz

12

To dlatego, że Wszystkie funkcje w PHP mają zasięg globalny - mogą być wywoływane poza funkcją, nawet jeśli zostały zdefiniowane wewnątrz i na odwrót.

Więc trzeba zrobić:

function inside_this() {  
    $some_var = MyClass::second_function(); 
}  
+1

Otrzymuję komunikat' call to protected method' error – JROB

+2

@JohnRobinson Dzieje się tak, ponieważ ta metoda jest chroniona – xdazz

+0

@dazz, czy istnieje i tak, aby zapisać * MyClass * w zmiennej i przekazać ją do funkcji zamiast twardego kodowania nazwy klasy 'MyClass' do kodu? (W przeciwnym razie, jeśli zmienimy nazwę klasy, musimy wyszukać i zastąpić "MyClass" w całym pliku) – Pacerier

3

Works z PHP 5.4:

<?php 
class A 
{ 
    public static function f() 
    { 
    $inner = function() 
    { 
     self::g(); 
    }; 

    $inner(); 
    } 

    private static function g() 
    { 
    echo "g\n"; 
    } 
} 

A::f(); 

wyjściowa:

g 
+0

Jego jest "chroniony", a nie "prywatny". –

+0

@Cole Johnson, prywatny jest * bardziej * restrykcyjny, dlatego użyłem go w moim przykładzie – Matthew

+3

@Matthew Czy istnieje jakakolwiek dokumentacja dotycząca tego, dlaczego to nie działa w wersji 5.3 PHP i działa w wersji 5.4 –

0

Spróbuj zmienić swoją pierwszą funkcję

public static function first_function() { 

    $function = function() {  
      $some_var = self::second_function(); // now will work 
    };    
    ///To call the function do this 
    $function(); 
    // other code here... 

} // End first_function 
Powiązane problemy