2015-11-21 2 views
3

Функция анонимного может использоваться как функция обратного вызова для функции, например. array_map, и одним из его преимуществ является использование use для использования переменной извне функции. Например:Альтернатива «использования» в старой версии PHP

$var = 10; 
$x = array_map(function($e) use ($var) { if($var > 5) return $e['prop']; }, $myArray); 

В старой версии PHP, когда обратный вызов должен быть существующей функцией и функцией, например. array_map получает имя функции в качестве аргумента обратного вызова?

$var = 10; 
$x = array_map("myFunction", $myArray); 

function myFunction($e) { 
    //how to get $var here? 
} 

Пожалуйста, имейте в виду, что я ищу для решения других, чем при использовании global переменной. Благодарю.

+0

но каковы вы действительно пытаетесь достичь? –

+0

Я бы использовал '$ GLOBALS ['var']'. '$ GLOBALS' является суперглобальной переменной (например,' $ _GET' или '$ _POST'), поэтому доступной для каждой функции. Каждая переменная является индексом в этом суперглобале. – Iansus

+0

@Dagon: Я хотел бы добиться того же, что и использование анонимной функции с 'use', но в более раннем PHP, который не поддерживает анонимную функцию. – maspai

ответ

1

Возможно, это тупой способ сделать это, но вы можете использовать перегруженный класс со статической переменной (так вроде глобальной ...). Я предлагаю только перегрузку, потому что она работает как обычная переменная (в том, как вы ее назначаете).

Я уверен, что кто-то, кто работал с PHP дольше, чем у меня, будет иметь лучшую идею. Также я не уверен, что «более старая версия» означает (сколько лет «старый»), но перегрузка продолжается не менее 5.0/5.1. Я думаю, что закрытие составляет около 5,3 (согласно этому ответу Which version of php add anonymous functions)? Это не точно сценарий, вы изложили, но получающий доступ значения становится доступным без использования истинного global:

class Overlord 
    { 
     private static $properties; 
     public static $val; 

     public function __get($property) 
      { 
       return (isset(self::$properties[$property]))? self::$properties[$property]:false; 
      } 

     public function __set($property,$value) 
      { 
       self::$val = self::$properties[$property] = $value; 
      } 

     public function __isset($property) 
      { 
       return (isset(self::$properties[$property]));   
      } 
    } 

function myFunction($e) { 
    return Overlord::$val." overloaded PLUS -->".$e; 
} 

// Create the mighty overloader class 
$ov   = new Overlord(); 
// Assign a variable 
$ov->val = 21; 
// Random well-thought-out array 
$myArray = array("One",1,"Two",2); 
// Run through the first variable 
$x = array_map("myFunction", $myArray); 
// Assign a second random variable 
$ov->stuff = 11; 
// Run through the array again with new variable 
$y = array_map("myFunction", $myArray); 
// Array one 
print_r($x); 
// Array two 
print_r($y); 

бы дать вам что-то вроде:

Array 
(
    [0] => 21 overloaded PLUS -->One 
    [1] => 21 overloaded PLUS -->1 
    [2] => 21 overloaded PLUS -->Two 
    [3] => 21 overloaded PLUS -->2 
) 
Array 
(
    [0] => 11 overloaded PLUS -->One 
    [1] => 11 overloaded PLUS -->1 
    [2] => 11 overloaded PLUS -->Two 
    [3] => 11 overloaded PLUS -->2 
) 
+0

Хорошая идея, используя класс со статической переменной. – maspai

Смежные вопросы