PHP связать переменную с областью действия функции в старых PHP - PullRequest
2 голосов
/ 04 апреля 2011

Я хотел бы связать переменную с областью действия функции, я могу сделать это в php, используя ключевое слово 'use' после PHP 5.3, однако как мне сделать эквивалент в версиях

  test_use_keyword();
  function test_use_keyword(){
    $test =2;
    $res=array_map(
      function($el) use ($test){
        return $el * $test;
      }, 
      array(3)
    );
    print_r($res); 
  }

Ответы [ 2 ]

1 голос
/ 04 апреля 2011

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

class Xy ( {
  private $test;
  public function __construct ($test) {
    $this->test = $test;
  }
  public function call ($el) {
    return $el * $this->test;
  }
}

print_r(array_map(array(new Xy(2), 'call'), array(3));

Также возможны старые добрые лямбды

$test = 2;
$a = create_function ('$el', 'return $el * ' . $test . ';');
print_r (array_map($a, array(3)));
0 голосов
/ 04 апреля 2011

Обычно через глобалы, серьезно.Хотя взломы могут быть использованы для имитации функциональности, как частичные функции в php .Извлечено из статьи:

function partial()
{
  if(!class_exists('partial'))
  {
    class partial{
        var $values = array();
        var $func;

        function partial($func, $args)
        {
            $this->values = $args;
            $this->func = $func;
        }

        function method()
        {
            $args = func_get_args();
            return call_user_func_array($this->func, array_merge($args, $this->values));
        }
    }
  }
  //assume $0 is funcname, $1-$x is partial values
  $args = func_get_args();   
  $func = $args[0];
  $p = new partial($func, array_slice($args,1));
  return array($p, 'method');
}

И только после этого вы можете получить что-то вроде.

function multiply_by($base, $value) {
  return $base * $value;
}

// ...
$res = array_map(partial("multiply_by", $test), array(3));

Не ... стоит ... это.

...