2015-11-21 42 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

相關問題