匿名函数可以用作函数的回调函数,例如array_map,其优点之一是使用use从函数外部使用变量。如。:

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

在旧的php版本中,当callback必须是一个现有的函数并且函数(例如array_map接收函数名作为回调参数)时,该怎么办?
$var = 10;
$x = array_map("myFunction", $myArray);

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

请记住,我正在寻找除使用global变量以外的解决方案。谢谢。

最佳答案

这可能是一个愚蠢的方法,但是您可以使用一个带静态变量的重载类(有点像全局变量…)。我只建议重载,因为它的工作方式类似于一个常规变量(在您如何分配它时)。
我相信使用php时间比我长的人会有更好的主意。我也不知道“旧版本”是什么意思(有多旧),但是重载至少可以追溯到5.0/5.1。我认为结束时间是5.3左右(根据这个答案)。这并不完全是您所描述的场景,但是访问该值时不使用trueglobal

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
)

关于php - 旧版PHP中的“使用”的替代方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33839052/

10-12 00:31
查看更多