2011-07-01 17 views
10

Aparentemente $ pid está fuera del alcance aquí. ¿No debería estar "cerrado" con la función? Estoy bastante seguro de que así es como funcionan los cierres en JavaScript, por ejemplo.Problema de alcance de cierre de PHP

Según algunos artículos php closures are broken, entonces no puedo acceder a este?

Entonces, ¿cómo se puede acceder a $ pid desde esta función de cierre?

class MyClass { 
    static function getHdvdsCol($pid) { 
    $col = new PointColumn(); 
    $col->key = $pid; 
    $col->parser = function($row) { 
     print $pid; // Undefined variable: pid 
    }; 
    return $col; 
    } 
} 

$func = MyClass::getHdvdsCol(45); 
call_user_func($func, $row); 

Editar he conseguido alrededor de ella con su uso: $col->parser = function($row) use($pid). Sin embargo, siento que esto es feo.

+4

No es fea, es cómo funcionan los cierres en php – zerkms

+0

así es como está en php así que ... – tradyblix

+0

Es un lenguaje feo, pero estoy atascado con eso. :( – Keyo

Respuesta

25

es necesario especificar qué variables se deben cerrar de esta manera:

function($row) use ($pid) { ... } 
+0

Si este cierre se guarda en una variable y luego pasa a otro ámbito donde $ pid no existe , ¿será pid envuelto en el cierre de alguna manera, o no accesible? –

+0

@Josh Nankin: en realidad 'use ($ var, ...)' es cómo se implementan los cierres en php. Así que si pasas la función anónima a otro ámbito variable - La variable '$ pid' contendrá el último valor definido – zerkms

+1

¿Esta cosa de" usar "se siente rara o simplemente soy yo? Simplemente no puedo superarla después de usar cierres en otros idiomas.:/ –

0

Usted puede utilizar el método bindTo.

class MyClass { 
    static function getHdvdsCol($pid) { 
    $col = new PointColumn(); 
    $col->key = $pid; 
    $parser = function($row) { 
     print $this->key; 
    }; 
    $col->parser = $parser->bindTo($parser, $parser); 
    return $col; 
    } 
} 

$func = MyClass::getHdvdsCol(45); 
call_user_func($func, $row); 
-4

Creo que PHP es muy consistente en el alcance de las variables. La regla es, si una variable se define fuera de una función, debe especificarla explícitamente. Para el alcance léxico se usa 'uso', para globales se usa 'global'.

Por ejemplo, no se puede también utilizar una variable global directamente:

$n = 5; 

function f() 
{ 
    echo $n; // Undefined variable 
} 

debe utilizar la palabra clave mundial:

$n = 5; 

function f() 
{ 
    global $n; 
    echo $n; 
} 
Cuestiones relacionadas