2012-06-29 15 views
11

Sto cercando di utilizzare una funzione PHP all'interno di una funzione statica pubblica in questo modo (cose che ho accorciato un po '):Impossibile accedere self :: quando nessun ambito classe è attiva

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 

È stato allora che ho ottenere l'errore "Impossibile accedere a self :: quando nessun ambito di classe è attivo".

Se chiamo second_function al di fuori della funzione inside_this, funziona benissimo:

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 

Che cosa devo fare per essere in grado di utilizzare second_function dall'interno della funzione inside_this?

+0

Hai provato una chiusura? 'function inside_this() use ($ self) {' – bfavaretto

+0

Ho appena provato- non ha funzionato :( – JROB

+0

Mi sono reso conto troppo tardi che 'self' non è una variabile ... – bfavaretto

risposta

12

Questo perché Tutte le funzioni in PHP hanno lo scopo globale - possono essere chiamate all'esterno di una funzione anche se sono state definite all'interno e viceversa.

Così si hanno a che fare:

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

Ho ricevuto l'errore' call to protected method ' – JROB

+2

@JohnRobinson Questo perché il metodo è protetto – xdazz

+0

@xdazz, c'è comunque il salvataggio di * MyClass * in una variabile e lo si passa alla funzione invece di codificare in modo rigido il nome della classe 'MyClass' nel codice? (Altrimenti se cambiamo il nome della classe, dobbiamo cercare e sostituire "MyClass" in tutto il file) – Pacerier

3

Compatibile con PHP 5.4:

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

    $inner(); 
    } 

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

A::f(); 

uscita:

g 
+0

Il suo è 'protetto', non' privato'. –

+0

@Cole Johnson, privato è * più * restrittivo, motivo per cui l'ho usato nel mio esempio – Matthew

+3

@Matthew C'è qualche documentazione sul perché questo non funziona nella versione 5.3 di php, e funziona nella versione 5.4 –

0

Provare a modificare la prima funzione a

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 
Problemi correlati